2011-07-06 161 views
1

我正在使用消費WCF服務的客戶端。在各種情況下,服務只是通過相關的消息引發FaultException,通知給出的故障背後的原因。處理WCF故障

這些錯誤中有一些是我們的客戶端應用程序可以處理的東西,但是我只是在FaultExceptions消息或Reason中執行一些字符串匹配而不是猶豫,以確定它是否可以滿足我們的要求。

我希望FaultException上的FaultCode可以用來識別我們可以處理的特定類型的Fault,但看起來這純粹是爲了識別一些SOAP錯誤。如果我對此的解釋不正確,請糾正我。

我知道它可能會引發FaultException,但我認爲期望爲出現故障後的每個原因創建新類型是不現實的。

你如何處理這種情況。作爲一個人爲的例子。考慮提供以下方法的服務;

RecordDetails GetRecordById(string id) 

void Add(RecordDetails record) 

void Update(RecordDetailsUpdateRequest rdur) 

現在,在上面的例子,如果你調用GetRecordById與不存在的ID,您收到的FaultException與說明消息「記錄無法找到」。同樣,如果您爲已存在的記錄調用Add或爲不存在的記錄調用Update,則只需通過Message/Reason詳細說明失敗原因即可獲得FaultException。我需要知道是否存在記錄,以確定是否應更新或插入。正如我所提到的,由於我無法控制它們是否會保持不變,所以我很猶豫是否僅僅匹配字符串。

在這種情況下(與FaultException有關的類型詳述了RecordNotFoundException等)或與FaultException相關的一些泛型類型會定義與錯誤相關的特定細節,您會期望什麼呢?例如,帶有成員代碼的RecordOperationExcpetion類(失敗原因的常量或枚舉標識符)以及用戶友好的消息。

至少這樣,我可以識別錯誤原因而不必求助於字符串匹配。

您的想法值得讚賞。

回答

2

我會和你上面說的一樣 - 與FaultException關聯的類型。您可以創建任意數量的表示爲DataContract的類來處理各種故障,然後將它們分配給WCF服務操作。

[DataContract] 
public class RecordOperationException 
{ 
    private int code; 
    private string message; 

    [DataMember] 
    public int Code 
    { 
     get 
     { 
      return code; 
     } 
     set 
     { 
      code = value; 
     } 
    } 

    [DataMember] 
    public string Message 
    { 
     get 
     { 
      return message; 
     } 
     set 
     { 
      message = value; 
     } 
    } 
} 

然後,你可以指定這個類作爲FaultException類型:

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
RecordDetails GetRecordById(string id) 

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
void Add(RecordDetails record) 

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
void Update(RecordDetailsUpdateRequest rdur) 

然後,您可以拋出相應的FaultException在你的方法,根據需要。

這將消除比較字符串的需要(這是一個好主意,IMO)。

+0

這當然是我的直覺,但我只是熱衷於找出更有經驗的從業者在過去所做的那樣(這仍然是相當新的給我)。不幸的是,我無法控制服務中的功能。但是,如果我可以提供一些很好的例子,說明爲什麼它應該以特定的方式完成,那麼它將有希望讓我們所有的生活變得更容易。感謝您的輸入:) –

+0

@Mr Moose - 我自己並不是專家,但就我所知,上述FaultContracts是最佳實踐。以下是一些可能爲您進一步闡述的鏈接:[指定和處理合同和服務中的錯誤](http://msdn.microsoft.com/zh-cn/library/ms733721.aspx),[WCF中的異常處理故障合同](http://www.c-sharpcorner.com/UploadFile/ankithakur/ExceptionHandlingWCF12282007072617AM/ExceptionHandlingWCF.aspx),[Fault Contract](http://www.wcftutorial.net/Fault-Contract.aspx)。 – Tim

0

總是使用FaultExceptions並將它們作爲OperationContract的一部分公佈,如代碼所示。

但是,我認爲還有比這更多的東西。

我們都知道,關注點的分離是一件好事,您可以通過您的服務實現此目標的方式是創建實現IErrorHandler的類。

這些可以用於你的類,你的錯誤處理可以從你的邏輯中分離出來,這是一個更清晰的方法。這也意味着您不必在整個代碼中重複相同的塊。

這也可以與一般的FaultException一起使用。

一個很好的資源是:http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx