4

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

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

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

ありがとう。

4

6 に答える 6

3

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

于 2009-01-20T18:41:38.683 に答える
2

私はあなたが説明したのと同じ方法で IErrorHanlder を使用しますが、ログには使用しません。サービス クラス (WCF であろうとなかろうと) の代わりに、こちらで説明されているようにインターセプターを使用します。このテクニックは、あなたが興味を持っている情報を捉えることができると信じています。

于 2008-10-22T02:44:50.080 に答える
2

オペレーション スレッドで呼び出される ProvideFault メソッドの Exception のデータ ディクショナリに記録するために必要なコンテキスト情報を隠しておくことができます。次に、ログ記録のために HandleError メソッドでそれを参照します。

于 2009-12-19T21:31:48.337 に答える
0

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

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

于 2009-06-19T03:42:06.767 に答える
0

Service Trace Viewerを使用しましたか?

于 2008-10-22T03:10:30.497 に答える
0

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

于 2009-06-22T12:21:31.973 に答える