普遍的な契約で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が含まれています。
CreateBufferedCopyは変更を行うようです。理由は不明です。あなたのソリューションはXmlDocumentとPreserveWhitespacesで動作しますが、質問から私が重要な違いはありません。あなたはまだ変更されたXMLを取得します。 クライアントの応答が正しいので、xml(reply = buffer.CreateMessage()の代わりに)からの応答をここで書き換える必要はありません。 – TomB