2010-03-04 187 views
24

我們正在WCF中開發一個代理服務器,它將作爲運行我們自定義客戶端應用程序的一些手持設備的通信手段。我很好奇什麼錯誤處理策略的人使用,因爲我寧願不嘗試在try/catch中包裝EVERY代理。WCF異常處理策略

當我開發ASP .NET時,我不會捕獲大多數異常,我在Global asax中使用Application_Error,然後可以記錄異常,發送電子郵件並將用戶重定向到自定義錯誤着陸頁。我在WCF中尋找的內容與此類似,不同之處在於它允許我從中心位置向客戶端傳遞一般錯誤原因。

基本上我很好奇人們如何在WCF應用程序中集中處理它們的異常。

感謝

+0

重要問題:您是否使用自定義故障/故障合同? – Aaronaught 2010-03-04 20:36:07

回答

22

您可能會在此找到IErrorHandler界面。我們一直在使用它來完成你所提到的事情 - 集中式異常日誌記錄,並提供一般性的故障原因,而不必花費大量的嘗試/捕獲代碼來嘗試和本地處理問題。

+1

是的,這實際上是我正在尋找的東西,採取了一些工作讓它去(見下文),但它的100%,我需要 – xximjasonxx 2010-03-04 20:40:34

+0

任何簡單的例子表示讚賞 – sll 2012-11-23 21:40:35

+1

你可以在這裏找到一個IErrorHandler的示例實現 - http: //www.neovolve.com/post/2008/04/07/implementing-ierrorhandler.aspx – 2012-12-06 15:14:01

2

我們使用異常來自客戶端處理應用程序塊和屏蔽大多數故障,以避免泄露敏感信息,這article可能是你一個很好的起點,與「最佳實踐」 - 你應該使用什麼適合你的域名。

15

所以這就是我所做的。我們的應用程序中有一些自定義異常,例如BusinessRuleException和ProcessException,WCF同時支持FaultException和FaultException<T>

一般的做法似乎是,如果發生一般性錯誤或者您不想顯示發生了什麼的錯誤,您總是會向客戶端拋出FaultException。在其他情況下,您可以通過FaultException<T>,其中T是一個包含特定例外信息的類。

我在應用程序中創建了Violations的這個概念,這基本上意味着任何自定義異常都有一個包含相應Violation實例的屬性。然後將此實例傳遞給客戶端,使客戶端能夠識別何時發生可恢復的錯誤。

這解決了這個問題的一部分,但我仍然想要一個普通的方法來捕捉所有可以讓我實現記錄的中心化。我通過使用IErrorHandle接口並將自己的自定義錯誤處理程序添加到WCF中,發現了這一點。下面是代碼:

public class ServiceHostGeneralErrorHandler : IErrorHandler 
{ 
    public void ProvideFault(Exception ex, MessageVersion version, ref Message fault) 
    { 
     if (ex is FaultException) 
      return; 

     // a general message to the client 
     var faultException = new FaultException("A General Error Occured"); 
     MessageFault messageFault = faultException.CreateMessageFault(); 
     fault = Message.CreateMessage(version, messageFault, null); 
    } 

    public bool HandleError(Exception ex) 
    { 
     // log the exception 

     // mark as handled 
     return true; 
    } 
} 

使用這種方法,我可以將從不管它是什麼的東西,可以同時在同一時間登錄真正的例外IT人員看到很容易在客戶端上顯示異常。到目前爲止,這種方法運行良好,並且遵循與應用程序中其他模塊相同的結構。

+0

如果我理解正確,我們都有相同的目標。這是我如何處理它。 http://stackoverflow.com/questions/6356669/wcf-exception-throwing-and-handling-the-oop-way你對這種方式有什麼看法? – user20358 2011-06-15 12:27:56