2017-05-11 7 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から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(); 
} 

XDocumentドキュメントは、変更された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); 

あなたはそれを避けたかった場合、あなたは、あなたの返事を渡すために、新しいメッセージを作成し、あなたのXDocumentがあなたのxmlまたは何を保存ロード、あなたがXmlWriterにメッセージを書き込む場所を以下のような何かをする必要があります。私は私のサービスの一つでこれに似た何かをする。

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

関連する問題