2016-06-23 4 views
0

私は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が呼び出されるのはなぜですか?

+0

HandleErrorの実装では、ジョブを実行した後、私は偽を返しますか? –

+0

はい、falseを返します。メッセージインスペクタで失敗すると、ProvideFaultメソッドが呼び出されず、HandleErrorが2回呼び出されます。クライアントは、2番目のHandleErrorが呼び出される前に500エラーレスポンスを受信します。私がサービスの一部として失敗すると、ProvideFaultが呼び出され、HandleErrorは一度だけ呼び出されます。私は、ErrorHandlerをClientdispatcherに2回追加しないことを確認しました。 –

+0

私は似たようなエラーで誰かを助けてくれることを覚えているので尋ねました。問題はProvideFaultがヒットしなかったため、HandleErrorでtrueを返してwcfエラーハンドラにエラーを投げて詳細情報を取得しました。申し訳ありませんが、私は正確に覚えていませんが、これは何らかの形で役立ちます。 –

答えて

0

私たちはMessageInspectorの同様の実装を持ち、各リクエストがどのくらいの時間を取ったか知りたいと思っていました。その結果、私たちは着信メッセージと発信メッセージの両方を記録しました。おそらくこれはあなたの問題の場合ですか?

拡張動作の中でProvideFaultメソッドが呼び出されたかどうかはわかりませんが、私は安らかなWCFサービスのコンストラクタ内から起動することができました。私は、インスペクタにtry/catchを置く "回避策"は良いアプローチだと思います。

以下

は、このトピックの実装の詳細と記事のカップルです:

IErrorHandler returning wrong message body when HTTP status code is 401 Unauthorized

How can I create custom XML namespace attributes when consuming a legacy SOAP service?

また、ここWEBAPIに似た何かを行う方法についての記事です:

http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

関連する問題