私はIErrorHandler
を実装し、それをChannelDispatcherのErrorHandlers
に添付することで、エラーを処理するサービスWCFサービスを持っています。 IErrorHandler
エンドポイントディスパッチャのメッセージインスペクタで未処理例外が発生した場合、WCF IErrorHandlerが異常な動作をするのはなぜですか?
は私が実装
bool HandleError(Exception error);
と呼ばれる方法があり、単に私のDBへの例外をログに記録します。
私の問題は、Webサービスのメソッドが呼び出される前にいくつかの例外が発生することです。
また、私はEndpointDispatcher
に添付したMessageInspector
を持っており、これは石鹸のメッセージを記録します。
ここで、SQLエラーが発生し、MessageInspectorで未処理の例外が発生した場合、同じSQL接続エラー例外を使用してHandleError
メソッドが2回呼び出されます。
問題は、接続のステータスが開いているときと接続のステータスが閉じているときに1回発生することです。
はまた、IErrorHandler
上の第二の方法:
void ProvideFault(Exception error, MessageVersion version, ref Message fault);
は呼び出されません、その後、フレームワークは、私がそれをフォーマットせずに、FaultException
と私の例外をラップします。
IErrorHandler
がそのように動作する理由はありますか?要求のパイプラインの一部として発生する処理されない例外を処理するために実装する必要がある他のモジュールはありますか? 接続が閉じたときにIErrorHandler
が呼び出されるのはなぜですか?
HandleErrorの実装では、ジョブを実行した後、私は偽を返しますか? –
はい、falseを返します。メッセージインスペクタで失敗すると、ProvideFaultメソッドが呼び出されず、HandleErrorが2回呼び出されます。クライアントは、2番目のHandleErrorが呼び出される前に500エラーレスポンスを受信します。私がサービスの一部として失敗すると、ProvideFaultが呼び出され、HandleErrorは一度だけ呼び出されます。私は、ErrorHandlerをClientdispatcherに2回追加しないことを確認しました。 –
私は似たようなエラーで誰かを助けてくれることを覚えているので尋ねました。問題はProvideFaultがヒットしなかったため、HandleErrorでtrueを返してwcfエラーハンドラにエラーを投げて詳細情報を取得しました。申し訳ありませんが、私は正確に覚えていませんが、これは何らかの形で役立ちます。 –