【问题标题】:IDispatchMessageInspector altered xmlIDispatchMessageInspector 更改了 xml
【发布时间】:2017-05-11 08:23:33
【问题描述】:

我正在使用带有通用合同的 WCF。传入和传出消息的记录是通过 IDispatchMessageInspector.AfterReceiveRequest 和 IDispatchMessageInspector.BeforeSendReply 完成的

最近发现Message的内容和我输入的不一样。

我为回复生成的数据:

<OTA_PingRS xmlns="http://www.opentravel.org/OTA/2003/05">
  <Success />
  <EchoData>Just some text24</EchoData>
</OTA_PingRS>

使用普通阅读器发送。 elMessageResult就是上面的xml。

private Message CreateResponse(MessageVersion ver, XElement elMessageResult)
{
    Message response = Message.CreateMessage(ver, "ProcessMessageResponse", elMessageResult.CreateReader());
    return response;
}

BeforeSendReply 复制消息并读取 xml

public void BeforeSendReply(ref Message reply, object correlationState)
{
    MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
    Message replyCopy = buffer.CreateMessage();

    XDocument doc;

    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriter writer = XmlWriter.Create(ms);
        replyCopy.WriteMessage(writer);
        writer.Flush();
        ms.Position = 0;

        doc = XDocument.Load(ms);
    }

    if (SaveLog != null)
    {
        LogSaveFileEventArgs logEventArgs = new LogSaveFileEventArgs(doc, true);
        SaveLog(this, logEventArgs);
    }

    reply = buffer.CreateMessage();
}

来自 BeforeSendReply 的 XDocument 文档包含更改的 xml。 Success 元素是 &lt;Success&gt;&lt;/Success&gt; 而不是 &lt;Success /&gt;

<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">ProcessMessageResponse</a:Action>
    <a:RelatesTo>urn:uuid:4D549F7F6D8D65FE891401181704779</a:RelatesTo>
  </s:Header>
  <s:Body>
    <OTA_PingRS xmlns="http://www.opentravel.org/OTA/2003/05">
      <Success></Success>
      <EchoData>Just some text24</EchoData>
    </OTA_PingRS>
  </s:Body>
</s:Envelope>

奇怪的是,在客户端收到了带有正确 Success 元素的原始 xml。使用 SoapUI 进行了测试。

这可能是一个小问题,因为 xml 仍然有效,但谁知道还会改变什么。如果出现错误,我依靠适当的日志记录进行调查。

我已经玩过 XmlWriterSettings 没有成功。 有什么想法吗?

编辑:

replyCopy.ToString() 已包含格式错误的 xml。

【问题讨论】:

    标签: xml wcf


    【解决方案1】:

    当您创建消息的缓冲副本时,&lt;Success /&gt; 标记会发生变化。

    reply.CreateBufferedCopy(Int32.MaxValue);
    

    如果您想避免这种情况,您需要执行以下操作,将消息写入XmlWriter,加载您的XDocument 保存 xml 或其他内容,然后创建一条新消息以传递您的回复.我在我的一项服务中做了类似的事情。

    using (MemoryStream ms = new MemoryStream())
    {
        var writer = XmlWriter.Create(ms);
        m.WriteMessage(writer);
        writer.Flush();
        ms.Position = 0;
        var doc = new XmlDocument();
        doc.PreserveWhitespace = true;
        doc.Load(ms);
    
        //savelog
    
        ms.Position = 0;
    
        var settings = new XmlReaderSettings //may not be needed
        {
            IgnoreWhitespace = true
        };
    
        var reader = XmlReader.Create(ms, settings);
        var newMessage = Message.CreateMessage(reader, int.MaxValue, m.Version);
        newMessage.Headers.Clear();
        newMessage.Headers.CopyHeadersFrom(m.Headers);
    }
    

    【讨论】:

    • CreateBufferedCopy 似乎做了修改。原因不明。您使用 XmlDocument 和 PreserveWhitespaces 的解决方案有效,但与我的问题相比并没有显着不同。您仍然会得到更改的 xml。这里不需要重写来自 xml 的响应(而不是 reply = buffer.CreateMessage()),因为客户端中的响应是正确的。
    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多