我使用WCF和通用合同。記錄傳入和傳出的消息是通過IDispatchMessageInspector.AfterReceiveRequest和IDispatchMessageInspector.BeforeSendReply完成的。IDispatchMessageInspector改變了xml
最近我發現消息內容與我的輸入不一樣。
數據I的答覆製備:
<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副本的消息,並讀取BeforeSendReply
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();
}
的XDocument文檔包含XML改變的XML。成功的要素是<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>
奇怪的是,在客戶端收到原始XML具有正確的成功元素。經過測試,使用SoapUI。
這可能是一個小問題,因爲xml仍然有效,但誰知道還有什麼會被改變。如果發生錯誤,我依靠正確的日誌進行調查。
我已經玩過XmlWriterSettings而沒有成功。 任何想法?
編輯:
replyCopy.ToString()已經包含了錯誤的格式化XML。
CreateBufferedCopy似乎做了修改。原因未知。你的解決方案與XmlDocument和PreserveWhitespaces的工作,但不會有顯着不同,當我從問題。你仍然會被改變的XML。 由於客戶端的響應正確,因此不需要在xml中重寫響應(而不是reply = buffer.CreateMessage())。 – TomB