在我們的WF4工作流程服務中,我們嘗試儘可能強大。我們所做的一件事是在HandleError和ProvideFault內部記錄錯誤(IErrorhandler)。該文件明確指出,的HandleError是做記錄正確的地方,但我看到一些奇怪的事情發生了:HandleError與ProvideFault在工作流服務中的不一致性,如何處理?
我看到一些錯誤,只有觸發ProvideFault,但從來沒有的HandleError,一個例子是:
System.NullReferenceException:未將對象引用設置爲對象的實例。 在System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstance() 在System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor
也有一些錯誤,只有觸發的HandleError但從來沒有ProvideFault,一個例子是:
System.ServiceModel.CommunicationException:從管道讀取時發生錯誤:管道已結束。 (109,0x6d)。 在System.ServiceModel.Channels.PipeConnection.Read(字節[]緩衝液,的Int32偏移的Int32大小,時間跨度超時) 在System.ServiceModel.Channels.SessionConnectionReader.Receive(時間跨度超時)
最後有錯誤,觸發,首先ProvideFault然後HandleError(在後臺線程)
如果可能,我也想記錄相應的傳入消息。我這樣做與OperationContext.Current.RequestContext.RequestMessage.ToString()這通常只能在ProvideFault,在我們的HandleError沒有任何的RequestContext更
所以,我的結論是,將所有日誌錯誤,我必須登錄這兩種方法。但是這會導致很多重複的日誌條目,因爲3 ..
我目前的解決方法是「記住」ProvideFault中最後一次記錄的異常,如果同一異常進入HandleError,則忽略它。看起來不是很乾淨。
有沒有人有更好,更可靠的方法登錄全部 WF服務內部可能發生的錯誤?
請不要指向Logging exceptions in WCF with IErrorHandler inside HandleError or ProvideFault?,因爲這不會提供任何幫助。