WCF消息正文在修改后显示<s:Body> ... stream ... </ s:Body>

dhi*_*esh 13 wcf

尝试使用MessageInspector在wcf服务之前通过代理修改消息.但是,在调试消息正文时,不会复制并显示正文

 <s:Body>... stream ...</s:Body>
Run Code Online (Sandbox Code Playgroud)

代码有什么问题?

public class CustomWCFMessageInspector : IClientMessageInspector
{
    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        request = ModifyMessage(request);
        return null;
    }

    private Message ModifyMessage(Message oldMessage)
    {
        Message newMessage = null;
        MessageBuffer msgbuf = oldMessage.CreateBufferedCopy(int.MaxValue);

        Message tmpMessage = msgbuf.CreateMessage();
        XmlDictionaryReader xdr = tmpMessage.GetReaderAtBodyContents();

        XDocument xd = ConvertToXDocument(xdr);

        EmitTags(xd);

        var ms = new MemoryStream();
        var xw = XmlWriter.Create(ms);
        xd.Save(xw);

        xw.Flush();
        xw.Close();

        ms.Position = 0;
        XmlReader xr = XmlReader.Create(ms);

        newMessage = Message.CreateMessage(tmpMessage.Version, null, xr);
        newMessage.Headers.CopyHeadersFrom(tmpMessage);
        newMessage.Properties.CopyProperties(tmpMessage.Properties);

        return newMessage;
    }
Run Code Online (Sandbox Code Playgroud)

}

小智 19

这是解决方案:如果你调用Message.ToString(),你会得到

..流..

而是使用System.Xml.XmlWriter.这是一个示例:

MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
Message msg = buffer.CreateMessage();
StringBuilder sb = new StringBuilder();
using (System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(sb))
{
    msg.WriteMessage(xw);
    xw.Close();
}
Console.WriteLine("Message Received:\n{0}", sb.ToString());
Run Code Online (Sandbox Code Playgroud)

  • 看来您还必须再次调用 buffer.CreateMessage() 并将其分配给传入的原始请求引用。该请求只能读取一次,因此如果您不这样做,您将得到一个错误。除此之外,这是正确的答案。 (2认同)

dhi*_*esh 14

问题是在执行ToString()之后,newMessage主体没有显示在监视窗口中

创建要在调试器中显示的消息的缓冲副本.

MessageBuffer messageBuffer = newMessage.CreateBufferedCopy(int.MaxValue);
Message message = messageBuffer.CreateMessage();
Run Code Online (Sandbox Code Playgroud)

所以代码中没有问题.只是调试器没有显示下面链接中提到的消息体

http://msdn.microsoft.com/en-us/library/ms734675(v=VS.90).aspx

在" 访问用于调试的消息正文"部分中.