我使用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。
答案 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);
}