2013-07-08 17 views
7

在我們的WF4工作流程服務中,我們嘗試儘可能強大。我們所做的一件事是在HandleError和ProvideFault內部記錄錯誤(IErrorhandler)。該文件明確指出,的HandleError是做記錄正確的地方,但我看到一些奇怪的事情發生了:HandleError與ProvideFault在工作流服務中的不一致性,如何處理?

  1. 我看到一些錯誤,只有觸發ProvideFault,但從來沒有的HandleError,一個例子是:

    System.NullReferenceException:未將對象引用設置爲對象的實例。 在System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstance() 在System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor

  2. 也有一些錯誤,只有觸發的HandleError但從來沒有ProvideFault,一個例子是:

    System.ServiceModel.CommunicationException:從管道讀取時發生錯誤:管道已結束。 (109,0x6d)。 在System.ServiceModel.Channels.PipeConnection.Read(字節[]緩衝液,的Int32偏移的Int32大小,時間跨度超時) 在System.ServiceModel.Channels.SessionConnectionReader.Receive(時間跨度超時)

  3. 最後有錯誤,觸發,首先ProvideFault然後HandleError(在後臺線程)

  4. 如果可能,我也想記錄相應的傳入消息。我這樣做與OperationContext.Current.RequestContext.RequestMessage.ToString()這通常只能在ProvideFault,在我們的HandleError沒有任何的RequestContext更

所以,我的結論是,將所有日誌錯誤,我必須登錄這兩種方法。但是這會導致很多重複的日誌條目,因爲3 ..

我目前的解決方法是「記住」ProvideFault中最後一次記錄的異常,如果同一異常進入HandleError,則忽略它。看起來不是很乾淨。

有沒有人有更好,更可靠的方法登錄全部 WF服務內部可能發生的錯誤?

請不要指向Logging exceptions in WCF with IErrorHandler inside HandleError or ProvideFault?,因爲這不會提供任何幫助。

回答

0

我見過的場景2發生在不同的上下文(BizTalk適配器),它似乎是HandleError叫,因爲有發生在適配器的例外,但ProvideFault叫,因爲沒有消息,實際上返回 - 故障發生的方式是阻止適配器實際生成/讀取/翻譯消息並將其傳遞到管道。這似乎排除了即使錯誤消息得到生成。從管道讀取失敗似乎構成了這種情況 - 您的服務不知道它是否失敗,因爲它從未連接過,或者由於遠程服務器失敗而失敗。像TransactionAbortedException這樣的東西也可能導致這種情況,或者(在我的情況下),SqlException可能導致它。

這應該爲案例#1提供一些線索,這是我沒有看到自己或再現的情況:這是由於在消息傳遞鏈中的某處發生了不正確的異常處理。在這種情況下,生成了一條錯誤消息,但鏈上的更高位置無法處理異常,因此可以調用HandleError。 A NullReferenceException在這裏是有意義的 - 如果你沒有正確處理空檢查,很難說這種情況下會發生什麼。

至於解決這個問題,我可能會嘗試登錄這兩個地方,並附加一些信息來解釋日誌的來源。即使它重複記錄,這也是失敗的。另一方面,如果你有一個生成一個或兩個這些場景的異常列表,你可以實現邏輯來檢查它是什麼樣的異常(或者它發生了什麼) - 如果它是一個異常很可能被其他方法處理。

相關問題