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

时间:2010-11-05 13:24:08

标签: wcf

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

 <s:Body>... stream ...</s:Body>

代码有什么问题?

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;
    }

}

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分:14)

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

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

MessageBuffer messageBuffer = newMessage.CreateBufferedCopy(int.MaxValue);
Message message = messageBuffer.CreateMessage();

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

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

访问邮件正文进行调试部分。

答案 2 :(得分:1)

我怀疑ToString会返回你得到的东西。 ToString通常用于调试,因此仅显示有关该对象的基本信息。你需要在ConvertToXDocument中做这样的事情:

XDocument x = XDocument.Load(xdr);