2013-07-08 11 views
7

私たちのWF4ワークフローサービスでは、できるだけ頑強にしようとしています。私たちがしていることの1つは、HandleErrorとProvideFault(IErrorhandler)の中にエラーを記録することです。ドキュメントの状態は明らかにそれのHandleErrorは、ロギングを行うには正しい場所でしょうが、私はいくつかの奇妙なことが起こる参照してください。ワークフローサービスのHandleErrorとProvideFaultの不一致、処理方法

  1. 私だけProvideFaultをトリガし、しかし、1例はHandleErrorは決してなかったいくつかのエラーを参照してください。

    System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor

  2. でSystem.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstanceで () のみのHandleErrorをトリガー多少の誤差もあります。ただし、ProvideFaultは一度もありませんでした。例:

    System.ServiceModel.CommunicationException:パイプからの読み取りエラー:パイプが終了しました。 (109、0x6d)。最後にあるSystem.ServiceModel.Channels.PipeConnection.Read System.ServiceModel.Channels.SessionConnectionReader.Receiveに(バイト[]バッファのInt32オフセット、のInt32のサイズ、のTimeSpanタイムアウト) (のTimeSpanタイムアウト)

  3. を起動するエラー、最初にProvideFault、次にHandleError(バックグラウンドスレッド)

  4. 可能であれば、対応する受信メッセージも記録したいと思います。私はOperationContext.Current.RequestContext.RequestMessage.ToString()は通常のみのHandleErrorで、ProvideFaultで動作します。この私たちはだから私の結論だった

これ以上、ALLログインするためにRequestContextのを持っていないと、これを行いますエラー、私は両方の方法でログインする必要があります。しかし、それは3のために重複したログエントリにつながります。

現在の回避策は、ProvideFaultから最後に記録された例外を「記憶」し、同じ例外がHandleErrorに入った場合は無視します。私にはあまりきれいに見えません。

ログを記録するには誰よりも信頼性の高い方法がありますすべて WFサービスで発生する可能性のあるエラー?

Logging exceptions in WCF with IErrorHandler inside HandleError or ProvideFault?は、何の助けもないので、指さないでください。

答えて

0

私は、シナリオ2は、異なるコンテキスト(のBizTalkアダプタ)で発生し、それがアダプタで発生した例外がありますのでHandleErrorが呼び出されるようだが、ProvideFaultは実際に何のメッセージはありませんので、呼び出されないで見てきましたreturn - アダプターが実際にメッセージを生成/読み込み/変換してメッセージをパイプラインに渡さないように、障害が発生しました。これはのエラーのメッセージが生成されないようにするようにも思われます。パイプからの読み込みに失敗した場合は、リモートサーバが失敗したために失敗したかどうか、接続されていないためにサービスが失敗したかどうかがわかりません。 TransactionAbortedExceptionのようなものもこれを引き起こす可能性がありますが、(私の場合は)SqlExceptionが原因になります。

これは、自分自身を見ていないか再現していないケース#1のヒントを与えるはずです。メッセージチェーンのどこかで不適切な例外処理が原因です。この場合、障害メッセージが生成されましたが、チェーンの上位のものがHandleErrorを呼び出すことができるように例外を処理できませんでした。 A NullReferenceExceptionはここで意味があります。ヌルチェックを適切に処理しないと、このような場合に何が起こるかを言うのは難しいです。

これを解決する限り、おそらく両方の場所にログインし、ログがどこから来たのかを説明するいくつかの追加情報を使用してください。ロギングが重複していても、フェイルセーフになります。一方、これらのシナリオの一方または両方を生成する例外のリストがある場合、その例外の種類(または発生した場所)を確認するロジックを実装することができます。他の方法で処理される可能性があります。

関連する問題