我有一个WCF网络服务。每当收到请求时,我都试图通过实现MessageInspector并在AfterReceiveRequest()事件中进行日志记录来进行一些日志记录。
由于某种原因,每当我使用WCFTestClient.exe向the服务发送请求时,一切都正常。该消息将被记录下来,请求将如常进行。
但是,当我使用SOAPUI作为客户端向when服务发送请求时,请求消息的副本将导致主体只显示<body>... stream ...</body>
,并且为了验证起见,它稍后无法作为XML文档加载。
我猜来自WCFTestClient.exe的请求是用缓冲消息体接收的,而来自SOAPUI的请求是作为流体接收的?这怎麽可能?
下面是我用来记录和复制请求消息的代码:
object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
try
{
MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
request = buffer.CreateMessage();
Message copy = buffer.CreateMessage();
LogRequest(copy);
ValidateMessage(ref request);
}
catch (Exception e)
{
throw new FaultException<>()...
}
return null;
}
如果请求消息来自带有流体的SOAPUI,则请求消息的副本无法加载到ValidateMessage()方法中的XML文档中。如果它来自具有缓冲体的WCFTestClient.exe,则它将成功地作为XML文档加载。
void validateMessage(ref System.ServiceModel.Channels.Message message)
{
XmlDocument bodyDoc = new XmlDocument();
//This load throws exception if request came from SOAPUI with streamed body...
bodyDoc.Load(message.GetReaderAtBodyContents());
...
}
Load()方法引发的异常是:
System.InvalidOperationException {“指定节点不能作为此节点的有效子节点插入,因为指定的节点是错误的类型”}。 在System.Xml.XmlDocument.AppendChildForLoad(XmlNode newChild,XmlDocument doc,at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)在System.Xml.XmlLoader.Load(XmlDocument doc,XmlReader reader,Boolean ),System.Xml.XmlDocument.Load(XmlReader reader)
发布于 2011-10-24 06:44:06
发布于 2011-10-18 09:46:28
抛出的异常是什么?GetReaderAtBodyContents()
返回的读取器位于主体内的第一个元素,而不是主体标记本身上。因此,加载消息的方式是不正确的,因为正文可能包含多个节点,在这种情况下,它将失败。
为了检查,您是否可以使用下面的代码来验证整个消息(副本)的内容,看看正文在从SOAPUI发送时是否包含完全相同的内容?
using (MemoryStream stream = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(stream))
{
message.WriteMessage(writer);
writer.Flush();
stream.Position = 0;
}
}
如果您想要体内的所有节点,您可能必须自己创建一个body节点。
发布于 2013-06-07 06:26:52
GetReaderAtBodyContents()方法返回主体的结束元素和soap信封的结束元素之间的任何字符。当XmlReader通过主体的结束元素时,线程中前面列出的异常将失败。
这里有更多信息:http://www.katlaconsulting.co.uk/blog/wcfxmlschemavalidation
https://stackoverflow.com/questions/7706944
复制