2011-10-09 8 views
4

私は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)で...

+1

はどのようにあなたのLogRequestメソッド内のメッセージをログに記録されていますか? – mlessard

+0

@mlessard Microsoft Entriprise Library Loggingフレームワークを使用しています。しかし、それは無関係なようです。その行をコメントアウトすると、メッセージを "request"変数にコピーする単純な行為によって問題が発生します。 – TerryB

+1

@TerryB:メッセージにToString()を使用していますか?これはメッセージを読む正しい方法ではないので、私はこれを求めています。 ToString()は、本体の内容を返さないことがよくあります。なぜなら、本体の中に「...ストリーム...」が入るからです。 msdn.microsoft.com/en-us/library/ms734675.aspxの「デバッグ用のメッセージ本文へのアクセス」を参照してください。 – mlessard

答えて

1

スローされる例外は、何ですか? GetReaderAtBodyContents()によって返されたリーダーは、bodyタグ自体ではなく、body内部の最初の要素に配置されます。したがって、本体に複数のノードが含まれている可能性があり、その場合には失敗するため、メッセージをロードする方法は正しくありません。

次のコードを使用して、メッセージ全体(コピー)の内容を検証し、本文にSOAPUIから送信されたものとまったく同じものが含まれているかどうかを確認できますか?


using (MemoryStream stream = new MemoryStream()) 
{ 
    using (XmlWriter writer = XmlWriter.Create(stream)) 
    { 
     message.WriteMessage(writer); 
     writer.Flush(); 
     stream.Position = 0; 
    } 
} 

ボディ内にすべてのノードが必要な場合は、Bodyノードを自分で作成する必要があります。

+0

こんにちは、私は例外がスローされた質問を更新しました。 – TerryB

+0

あなたのコードを使用して、各リクエストのファイルにストリームを書き出しました。 SOAPUIからの要求メッセージは、コピーされる前と変わらず、WCFClientから送信された要求とも同じです。したがって、WCFClientからのメッセージはコピーされても問題なく動作します。 SOAPUIからのメッセージは、コピーされていればXML文書にロードされません。コピーされていない場合は、それも問題ありません。 2つのシナリオの間にある唯一の違いは、SOAPUIのものが ...ストリーム...の場合、デバッグやToString()を使用してWCFClientからのものを表示していないことです。 – TerryB

+1

私はSOAPUIを知らないので、それを手伝ってはいけません。 ToString()を使用すると、 "... stream ..."を見るのは正常です。 ToString()はボディの内容を返すわけではないので、デバッグには使わないでください。また、XmlDocument.Load()に渡すものは本文ノード自体の内容ではなく、本文ノードの内容であるため、コードがXmlDocumentで本文を読み込めないことも普通です。 「http://stackoverflow.com/questions/6091212/get-body-from-wcf-message」を参照してください。それは役に立ちますか? – mlessard

2

SOAPUIは、ストリームとして構築するメッセージ要求を常に送信すると考えています。あなたがSOAPUIテストのコードかSOAPUIのSOAPUI設定オプション/ファイルのどちらかで修正できるものかどうかはわかりません。

herehereのように、バインディングのTransferModeプロパティをCkeckに設定します。バッファリングされたリクエストとストリーミングされたリクエストを送信するクライアントに対して、異なるカスタムバインディングを使用して複数のエンドポイントを持つ可能性があります。

これが役に立ちます。

0

GetReaderAtBodyContents()メソッドは、本文の終了要素とsoapエンベロープの終了要素の間の任意の文字を返します。 XmlReaderは、本体の終了要素を超えて読み込まれたときにスレッドの前にリストされた例外で失敗します。ここ

より: http://www.katlaconsulting.co.uk/blog/wcfxmlschemavalidation

関連する問題