2017-05-11 100 views
1

我使用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。

回答

0

當您創建消息的緩衝副本時,<Success />標記發生變化。

reply.CreateBufferedCopy(Int32.MaxValue); 

如果你想避免這種情況,你需要做這樣的事情,你寫郵件到XmlWriter下面,XML加載XDocument救你或什麼的,然後創建一個新的消息來傳遞對您的回覆。我在其中一項服務中做了類似的事情。

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

CreateBufferedCopy似乎做了修改。原因未知。你的解決方案與XmlDocument和PreserveWhitespaces的工作,但不會有顯着不同,當我從問題。你仍然會被改變的XML。 由於客戶端的響應正確,因此不需要在xml中重寫響應(而不是reply = buffer.CreateMessage())。 – TomB