2011-08-02 23 views
1

私が取り組んでいるサービスのためのWebテストクライアントを作成しています。そのための要件の一部として、完全な要求と応答のSOAPメッセージ(およびユーザーへのHTTPヘッダー)。WCFのクライアントメッセージインスペクタからヘッダー値を取得する方法

私は、それぞれの要求&応答メッセージへのアクセスを得るために最も顕著BeforeSendRequestAfterReceiveReply方法、IClientMessageInspectorを実装MessageInspectorクラスを実装しました。

レスポンス(AfterReceiveReply)をキャプチャするのは効果的ですが、リクエストをキャプチャするのは部分的にしか動作しません。ほとんどのメッセージにアクセスできますが、SOAPヘッダーとHTTPヘッダーは両方とも空です。 Fiddlerでリクエストを見ると、WCFがSOAPヘッダーのセキュリティーヘッダーと「束」を送信していることがわかります。

BeforeSendRequest方法は、私はHTTPとセキュリティヘッダが欠落している理由はわからないんだけど...それの要旨は...

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
{ 
    this.RequestMessage = request.ToString(); // Security header is missing from message 

    // Try to get HTTP headers 
    object req; // req is always null 
    if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out req)) 
    { 
     this.RequestHeaders = ((HttpRequestMessageProperty)req).Headers; 
    } 

    return null; 
} 

非常に簡単です。これを行うより良い方法はありますか?

  • ウェイン

答えて

5

検査官は、メッセージフォーマッタを存在直後メッセージを見て、それが(潜在的に)前にメッセージが変更されます(セキュリティなど)プロトコル・チャネルのいずれかに到達する前にそれを渡します(http://blogs.msdn.com/b/carlosfigueira/archive/2011/07/12/wcf-extensibility-channels.aspxのWCFチャンネルに関する記事の図を参照)。したがって、インスペクタレベルでは、メッセージによって追加された追加のSOAPヘッダーを見つけることができません。 HTTPヘッダーは、メッセージがメッセージインスペクターを通過した後に到達するトランスポートによって追加されます。

メッセージ内のすべてのSOAPヘッダーを表示する場合は、新しい「プロトコル」チャネル(正確にはhttp://msdn.microsoft.com/en-us/library/ms751495.aspxのサンプル)または新しいメッセージエンコーダ(既存のエンコーダをラップすることができます。送信メッセージがエンコードされる直前に検査する)。

トランスポートはメッセージがWCFを通過する最後の部分であるため、HTTPヘッダーを見ることが難しくなります。私はそれを行うカスタムトランスポートチャネルを書くことができると思いますが、それは間違いなく多くのコードになります。

+0

優秀な情報...ありがとう。カスタムメッセージエンコーダーのルートに行きます。 – WayneC

+1

私はあなたの記事に基づいてメッセージのすべてのSOAPヘッダーを取得する非常に簡単な方法を実際に見つけました:http://blogs.msdn.com/b/carlosfigueira/archive/2011/08/02/wcf-extensibility-system -diagnostic-tracing.aspx。私は基本的にカスタムセッショントレースリスナーを作成し、関連するメッセージをHTTPセッションに保存しました。このセッションはGUIで取得して表示できます。 – WayneC

関連する問題