2008-10-21 57 views
4

我試圖在我的WCF服務中實現一個IErrorHandler,以便在傳遞給客戶端之前記錄每個遇到服務邊界的異常。我已經使用IErrorHandlers將異常轉換爲類型FaultExceptions,這非常有用。根據IErrorHandler.HandleError()的MSDN,它也打算用於邊界記錄。服務邊界WCF錯誤記錄

問題是,HandleError函數不能保證在操作線程上被調用,所以我不知道如何獲得有關什麼操作觸發異常的信息。我可以將TargetSite從異常本身中解脫出來,但是這給了我內部方法而不是操作。我還可以通過StackTrace字符串來解析它的位置,但這看起來有點脆弱和麻煩。在HandleError函數中是否有任何一致且支持的方式來獲取任何狀態信息(消息,操作描述,任何東西)?或者任何其他方式自動記錄服務調用異常?

我正在尋找解決方案來實現生產,使用我現有的日誌框架,所以SvcTraceViewer不會爲我做。

謝謝。

回答

3

我最終把日誌記錄在IErrorHandler.ProvideFault()而不是IErrorHandler.HandlerError()中。 ProvideFault調用是在操作線程中完成的,所以我可以使用OperationContext.Current獲取一些信息來記錄日誌。

2

我使用IErrorHanlder的方式與您描述的相同,但不適用於日誌記錄。取而代之的是服務類(WCF或不),我使用攔截器,如here所述。我相信這種技術會捕捉到您感興趣的信息。

+0

AOP總是嚇壞我,但在這裏看起來非常適用。感謝你的分享。 – smaclell 2008-10-22 02:56:12

0

在傳入調用線程上正在調用ProvideFault()操作,並且客戶端仍然阻塞等待響應。我不認爲在這個方法中添加一個冗長的進程(比如日誌記錄)是不錯的主意。這就是爲什麼他們暴露了另一個操作HandleError,它在單獨的工作線程上被調用。

但我理解你的情況。如果您發現除了在ProvideFault內部登錄之外的解決方案,請共享。

0

如何創建一個實例並在該實例上保存請求消息?

2

您可以存儲任何上下文信息,您需要登錄在操作線程上調用的ProvideFault方法中的Exception's Data字典...然後在HandleError方法中引用它以進行日誌記錄。