私はWCF Webサービスを持っています。私は、MessageInspectorを実装し、AfterReceiveRequest()イベントにログインしてリクエストを受け取ったときに、いくつかのロギングを試みています。WCFリクエストボディがストリームであり、バッファリングされることがありますか?
何らかの理由で、私がWCFTestClient.exeを使用してWebサービスにリクエストを送信すると、すべて正常に動作します。メッセージはログに記録され、要求は通常通り進行します。
クライアントとしてSOAPUIを使用してWebサービスにリクエストを送信すると、リクエストメッセージのコピーを作成するとボディには<body>... stream ...</body>
が表示され、後で検証のためにXMLドキュメントとしてロードされません。
WCFTestClient.exeからの要求がバッファリングされたメッセージ本文で受信され、SOAPUIからの要求がストリーミングされた本体として受信されたと思いますか?これはどのように可能ですか?
いずれのバージョンのコピーも安全に作成できるコードがありますか?私はまだ、CreateBufferedCopy()が明らかにこれを達成しないので、ストリームされたバージョンを安全にコピーする方法を見つけ出す必要があります。
また、バッファ付きのメッセージ本文を作成し、ストリームを作成しないようにWCFを構成することはできますか?ここで
は、私は、要求メッセージをログに記録してコピーするには使用していたコードです:
object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
try
{
MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
request = buffer.CreateMessage();
Message copy = buffer.CreateMessage();
LogRequest(copy);
ValidateMessage(ref request);
}
catch (Exception e)
{
throw new FaultException<>()...
}
return null;
}
要求メッセージのコピーがあればValidateMessage()メソッド内のXML文書にロードすることができませんそれはストリームボディでSOAPUIから来ました。これは、バッファされた本体を持つWCFTestClient.exeから来た場合、XML文書としてロードされます。
void validateMessage(ref System.ServiceModel.Channels.Message message)
{
XmlDocument bodyDoc = new XmlDocument();
//This load throws exception if request came from SOAPUI with streamed body...
bodyDoc.Load(message.GetReaderAtBodyContents());
...
}
load()メソッドによってスローされた例外がある:
のSystem.InvalidOperationException { "指定したノード であるため、指定されたノードが は、このノードの有効な子として挿入することができません間違ったタイプ。 "}
System.Xml.XmlDocument.AppendChildForLoad(のXmlNode newChildで、 常にXmlDocument DOC)で System.Xml.XmlLoader.LoadDocSequence(常にXmlDocument parentDoc)でにSystem.Xml.XmlDocument.Load(XmlReaderの リーダー)でSystem.Xml.XmlLoader.Load(XmlDocumentのドキュメント、XmlReaderのリーダー、ブール のPreserveWhitespace)で...
はどのようにあなたのLogRequestメソッド内のメッセージをログに記録されていますか? – mlessard
@mlessard Microsoft Entriprise Library Loggingフレームワークを使用しています。しかし、それは無関係なようです。その行をコメントアウトすると、メッセージを "request"変数にコピーする単純な行為によって問題が発生します。 – TerryB
@TerryB:メッセージにToString()を使用していますか?これはメッセージを読む正しい方法ではないので、私はこれを求めています。 ToString()は、本体の内容を返さないことがよくあります。なぜなら、本体の中に「...ストリーム...」が入るからです。 msdn.microsoft.com/en-us/library/ms734675.aspxの「デバッグ用のメッセージ本文へのアクセス」を参照してください。 – mlessard