2010-05-19 31 views
6

我使用IErrorHandler在WCF中執行異常處理,現在我想記錄異常,以及堆棧跟蹤和導致異常的用戶。在HandleError或ProvideFault中使用IErrorHandler記錄WCF中的異常?

我可以看到來獲取引起異常的用戶的唯一方法是:

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

...但這似乎只是內部ProvideFault工作,而不是在HandleError中。有沒有辦法讓用戶進入HandleError?我想使用HandleError而不是ProvideFault,因爲它在後臺線程中調用,並且用於錯誤日誌記錄,對嗎?

回答

3

的IErrorHandler的兩種方法有相當明確的職責:

  • 的HandleError是在這裏處理所有未捕獲的異常 - 這就是爲什麼它是做你的記錄最好的地方 - 這是真正的全部原因要

  • ProvideFault的任務是把你的.NET異常變成一個可互操作的SOAP錯誤 - 或者忽略異常產品總數

當然,沒有什麼技術上阻止你在ProvideFault方法中執行日誌記錄 - 如果我不得不尋找它,那就不是我會去尋找這個功能的地方。我傾向於遵循最不讓人驚訝的原則 - 如果方法被稱爲ProvideFault,我只希望它提供一個FaultException<T>-不會做很多其他事情。

要訪問你的服務的安全上下文中,使用此代碼片段:

ServiceSecurityContext secCtx = ServiceSecurityContext.Current; 

if(secCtx.PrimaryIdentity != null) 
{ 
    // do something with primary identity 
} 
+0

我不同意,但怎麼開始從的HandleError方法內部的用戶信息(ServiceSecurityContext.PrimaryIdentity)? – Dannerbo 2010-05-19 21:20:32

+0

@Dannerbo:更新了我的回答 – 2010-05-20 05:24:39

+8

在我的環境中訪問HandleError()中的ServiceSecurityContext.Current時,拋出ObjectDisposedException爲「消息已關閉」文本。 – UserControl 2010-11-27 21:16:34