2011-07-12 189 views
2

我爲我的wcf應用程序構建了一個全局異常處理。我有一個實現「IErrorHandler」並處理異常的類。我可以使用'IServiceBehavior'屬性註冊ErrorHandler。 (所以我不需要觸及每個函數)WCF全局異常處理

我使用類FaultException來包裝我的異常對象。

Dim sysEx As SystemException = 'Do Convert 
Dim fex As New FaultException(Of SystemException)(sysEx, sysEx.Message) 
Dim faultMessage As MessageFault = fex.CreateMessageFault 
fault = System.ServiceModel.Channels.Message.CreateMessage(version, faultMessage, fex.Action) 

現在我可以檢索客戶端的錯誤消息。但不幸的是,我無法檢索原始的異常類型或原始堆棧跟蹤。

是否有一個簡單的選擇來解決問題,而不會在我的服務中爲每個功能添加「FaultContract」?

謝謝

回答

1

Steve & Saravanan都是正確的。下面是如何創建一個自定義故障類型&如何使用它:

自定義錯誤契約:

[DataContract] 
public class UncaughtErrorFault 
{ 
    [DataMember] 
    public string ExecptionType { get; set; } 

    [DataMember] 
    public string Message { get; set; } 

    [DataMember] 
    public string StackTrace { get; set; } 
} 

IErrorHandler方法重寫:

public void ProvideFault(Exception error, 
         MessageVersion version, 
         ref Message fault) 
{ 
    var fe = new FaultException<UncaughtErrorFault>(
     new UncaughtErrorFault 
      { 
       ExecptionType = error.GetType().Name, 
       Message = error.Message, 
       StackTrace = error.StackTrace 
      }, 
     error.Message, 
     FaultCode.CreateReceiverFaultCode(
      new FaultCode(error.GetType().Name))); 

    var mf = fe.CreateMessageFault(); 

    fault = Message.CreateMessage(version, mf, fe.Action); 
} 
+0

也許我表達自己錯了。我怎樣才能將「UncaughtErrorFault」類「發佈」到客戶端?該類型不會被添加到自動生成的「服務引用」(當然)。所以WCF將故障轉換回正常的System.Exception,而不是在「UncaughtErrorFault」對象中。我該如何解決這個問題? – Mimefilt

+0

要發佈自定義錯誤,請查看此[MSDN文章](http://msdn.microsoft.com/zh-cn/library/ms733841.aspx)。它顯示瞭如何使用指定您的自定義類型的FaultContract屬性標記服務OperationContract方法。但是,您的意志需要標記服務的每個操作方法以使服務引用包含必要的反序列化代碼。這就是我在@SteveWilkes評論中提到的 –

1

使用FaultContracts和投擲FaultExceptions定製Fault類型是WCF移交例外the recommended way。如果您需要在客戶端檢索堆棧跟蹤,則可以在WCF行爲配置中將includeExceptionDetailInFaults設置爲true。

+0

不幸的是,服務可以拋出正常的.NET異常和有一些「封閉源代碼」部分也會拋出正常的.NET異常。所以我需要一種通用且易於處理的方式將.NET異常轉換爲SOAP錯誤。爲此我寫了上面的代碼。不幸的是,我不知道如何創建一個可以包含更多屬性的自定義錯誤,而無需爲每個函數添加FaultContract。 – Mimefilt

+0

除非您希望WCF拋出該自定義錯誤,否則不需要爲操作方法添加FaultContract屬性。你總是可以捕獲標準的WCF FaultException,因爲你的自定義錯誤是「嵌入」它的。您可以爲FaultException類型編寫擴展方法來提取您提供的任何自定義信息。 –

0

在IErrorHandler.ProvideFault中,第一個參數中出現異常。您可以將其包裝在您的自定義FaultMessage中。

IErrorHandler.ProvideFault(異常錯誤,MessageVersion版本,參考消息故障)

請參考IErrorHandler Interface。這個頁面提供了一個關於如何做這個異常包裝的例子。