質問

クライアントに渡される前にサービス境界に到達するすべての例外をログに記録するために、WCFサービスにIErrorHandlerを実装しようとしています。例外を型指定されたFaultExceptionsに変換するためにIErrorHandlersを既に使用していますが、これは非常に便利です。 IErrorHandler.HandleError()のMSDNによると、境界でのログ記録に使用することも意図されています。

問題は、HandleError関数が操作スレッドで呼び出されることが保証されていないため、どの操作が例外をトリガーしたかについての情報を取得する方法がわからないことです。例外自体からTargetSiteを取得できますが、操作ではなく内部メソッドが提供されます。 StackTrace文字列を解析して、それがスローされた場所を特定することもできましたが、これは少し壊れやすくて気味が悪いようです。 HandleError関数の実行中に、状態情報(メッセージ、操作の説明など)を取得するための一貫したサポートされた方法はありますか?または、サービス呼び出しの例外を自動的に記録する他の方法はありますか?

既存のロギングフレームワークを使用して、本番環境に実装するソリューションを探しているので、SvcTraceViewerはそれを行いません。

ありがとう。

役に立ちましたか?

解決

IErrorHandler.HandlerError()ではなく、IErrorHandler.ProvideFault()にログを記録することになりました。 ProvideFault呼び出しは操作スレッドで行われるため、OperationContext.Currentを使用してログに記録する情報を取得できます。

他のヒント

説明と同じ方法でIErrorHanlderを使用しますが、ロギングには使用しません。代わりに、サービスクラス(WCFかどうか)で、こちら。この手法は、あなたが興味を持っている情報を取り込むと信じています。

操作スレッドで呼び出されるProvideFaultメソッドで、例外のデータディクショナリにログインする必要があるコンテキスト情報を隠しておくことができます。その後、ロギングのためにHandleErrorメソッドで参照します。

サービストレースビューアーを使用しましたか?

>

ProvidFault()操作は着信コールスレッドで呼び出されており、クライアントは応答を待機するためにまだブロックされています。このメソッド内に長いプロセス(ロギングなど)を追加することは良い考えではないと思います。そのため、別のワーカースレッドで呼び出される別の操作HandleErrorを公開しました。

しかし、私はあなたの状況を理解しています。 ProvideFault内にログインする以外の解決策を見つけた場合は共有してください。

インスタンスを作成し、そのインスタンスにリクエストメッセージを保存するのはどうですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top