2011-07-21 16 views
3

私はWCFサービスを呼び出すアプリケーションを持っています。監視と追跡の目的で、アプリケーションがサービスを呼び出すことに失敗したすべての要求メッセージを記録したいと思います。 Loke私はRemoveSubscriptionと呼ばれる操作を呼び出す必要がありました(ネットワークの問題またはWCFサービスがダウンしている可能性があります)SOAPメッセージをxmlまたはtxtファイルに記録したいと思います。プロキシクライアントでSOAPリクエスト本体を取得

一般的に、プロキシクラスで要求SOAP連絡先を取得することは可能です。

私は、SoapExtensionクラスを拡張することでそれができるという情報が見つかりました。これが適切な方法であれば、SoapExtensionをチャネルスタックに拡張する新しいクラスを登録/注入する方法です。

EDIT:サービスはIISでホストされていません.Windowsサービス...このケースでは、SoapExtensionは適切な解決策ではありません。

+1

'SoapExtension'はWCF用ではありません。 "wcf tracing"を探します。 –

+0

@Johnはい、そうです。SoapExtensionは、ASP.NET Webサービスにしかないようです。トレースについては、トレース機能を使用してそれを達成する方法が見つかりませんでした。だから私は傍受者に集中してきた。 – NDeveloper

+0

メッセージロギングを使用して行うこともできますが、インターセプタはより徹底的です。 –

答えて

3

WCFベースのクライアントを使用すると、応答メッセージ&をインターセプトするエンドポイント動作を作成できます。このTechNet articleは、送信されるメッセージと応答メッセージにアクセスする方法を示しています。 WCFクライアントは、Visual Studioでサービスリファレンスを追加するか、SvcUtilを使用して手動でクライアントコードを生成するか、独自のプロキシをChannelFactoryクラスを使用してコード内で直接ローリングすることによって生成できます。

あなたのロギングコードは、リクエストされたステータスとタイムスタンプを持つリクエストメッセージを、いつも何らかのデータストア(ファイル、データベースなど)に書き出します。レスポンスメッセージが受信されると、何らかの形でレスポンスからリクエストメッセージに一致しますメッセージの内容を更新し、データストアを更新してステータスを応答するように変更します。データストアからすべてのメッセージを選択し、要求されたより古い状態で、ある期間はすべての失敗したメッセージをリストします。

+0

本当にありがとうございました。今、私はすべての要求と応答を得ることができます。唯一残っているのは、失敗した要求だけをログに記録する方法です。 BeforeSendRequest内の変数にリクエストを格納し、AfterReceiveReplyがフォルトで受信されると、そのリクエストをログに記録できますか? – NDeveloper

+0

WCFクライアントが実行されているアプリケーションのスレッドモデルは、プライベートクラス変数を使用して必要なものを格納することが安全かどうかを判断します。デフォルトでIClientMessageInspectorの実装は**スレッドセーフではありません**。あなたのアプリがシングルスレッドであればOKです。また、サービスへの非同期呼び出しを行うと、スレッドの安全性が複雑になることがあります。 –

+0

あなたの時間をありがとうございましたSixtoは本当にこれで私を助けました。 – NDeveloper

関連する問題