IDispatchMessageInspector更改了xml

时间:2017-05-11 08:23:34

标签: xml wcf

我使用WCF与普遍合同。记录传入和传出消息是通过IDispatchMessageInspector.AfterReceiveRequest和IDispatchMessageInspector.BeforeSendReply

完成的。

最近我发现消息内容与我的输入不同。

我为回复制作的数据:

<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元素为<Success></Success>,而不是<Success />

<?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。

1 个答案:

答案 0 :(得分:0)

创建邮件的缓冲副本时,<Success />标记会发生变化。

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