代码之家  ›  专栏  ›  技术社区  ›  dhinesh

WCF消息正文显示修改后的<s:body>…流…</s:body>

wcf
  •  12
  • dhinesh  · 技术社区  · 15 年前

    尝试使用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 回复  |  直到 15 年前
        1
  •  20
  •   dbos1545 Denis Kochnev    14 年前

    以下是解决方案: 如果调用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());
    
        2
  •  14
  •   dhinesh    15 年前

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

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

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

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

    访问消息正文

        3
  •  1
  •   Iain    15 年前

    我想ToString会把你得到的还给你。ToString通常用于调试,因此只显示有关对象的基本信息。您需要在convertoxdocument中执行以下操作:

    XDocument x = XDocument.Load(xdr);
    
    推荐文章