当社の WF4 ワークフロー サービスでは、可能な限り堅牢になるように努めています。私たちが行うことの 1 つは、HandleError および ProvideFault ( IErrorhandler ) 内のエラーをログに記録することです。ドキュメントには、HandleError がログを記録するのに適切な場所であることが明確に記載されていますが、いくつかの奇妙なことが起こることがわかります。
ProvideFaultのみをトリガーし、HandleErrorをトリガーしないいくつかのエラーが表示されます。1 つの例は次のとおりです。
System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstance() で System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor で
HandleErrorのみをトリガーし、ProvideFault をトリガーしないエラーもいくつかあります。1 つの例は次のとおりです。
System.ServiceModel.CommunicationException: パイプからの読み取り中にエラーが発生しました: パイプは終了しました。(109、0x6d)。System.ServiceModel.Channels.PipeConnection.Read (Byte[] バッファー、Int32 オフセット、Int32 サイズ、TimeSpan タイムアウト) で System.ServiceModel.Channels.SessionConnectionReader.Receive (TimeSpan タイムアウト) で
最後に、最初に ProvideFault と次に HandleError (バックグラウンド スレッドで) の両方をトリガーするエラーがあります。
可能であれば、対応する着信メッセージもログに記録したいと考えています。私はOperationContext.Current.RequestContext.RequestMessage.ToString()でこれを行います。これは通常、ProvideFault でのみ機能します。HandleError では、RequestContext はもうありません。
したがって、私の結論は、すべてのエラーをログに記録するには、両方の方法でログインする必要があるということでした。しかし、それは 3.. が原因で、多くの重複したログ エントリにつながります。
私の現在の回避策は、ProvideFault から最後にログに記録された例外を「記憶」し、同じ例外が HandleError に入った場合は無視することでした。私にはあまりきれいに見えません。
WF サービス内で発生する可能性のあるすべてのエラーをログに記録するための、より優れた信頼できる方法はありますか?
また、HandleError または ProvideFault 内で IErrorHandler を使用して WCF で例外をログに記録することを指摘しないでください。それは何の助けにもならないからです。