所以這就是我所做的。我們的應用程序中有一些自定義異常,例如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人員看到很容易在客戶端上顯示異常。到目前爲止,這種方法運行良好,並且遵循與應用程序中其他模塊相同的結構。
重要問題:您是否使用自定義故障/故障合同? – Aaronaught 2010-03-04 20:36:07