2008-09-18 117 views
6

我正在第一次編寫WCF服務。該服務及其所有客戶(至少現在)都是用C#編寫的。該服務必須對所傳遞的數據進行大量輸入驗證,因此我需要一些方法將無效數據返回給客戶端。我一直在閱讀很多有關錯誤和異常的內容,包括錯誤中的例外情況,以及許多相互衝突的文章,這些文章只是讓我更加困惑。什麼是處理這種情況的正確方法?WCF故障和異常

我應該完全避免異常並打包結果返回消息嗎?我應該創建一個特殊的Fault還是一個特殊的Exception,或者像我爲非WCF驗證函數一樣拋出ArgumentExceptions?

我已經把現在(由MSDN影響)的代碼是:

[DataContract] 
public class ValidationFault 
{ 
    [DataMember] 
    public Dictionary<string, string> Errors { get; private set; } 

    [DataMember] 
    public bool Fatal { get; private set; } 

    [DataMember] 
    public Guid SeriesIdentifier { get; private set; } 

    public ValidationFault(Guid id, string argument, string error, bool fatal) 
    { 
     SeriesIdentifier = id; 
     Errors = new Dictionary<string, string> {{argument, error}}; 
     Fatal = fatal; 
    } 

    public void AddError(string argument, string error, bool fatal) 
    { 
     Errors.Add(argument, error); 
     Fatal |= fatal; 
    } 
} 

而且在方法有[FaultContract(typeof運算(ValidationFault))。那麼這是否是「正確」的方法?

回答

3

如果您正在客戶端進行驗證,並且在傳入方法(Web服務調用)後應該具有有效值,那麼我會拋出異常。它可能是一個異常,表示參數的名稱與參數無效。 (請參閱:ArgumentException)

但是,您可能不希望依賴客戶端來正確驗證數據,並且假定數據可能無效進入Web服務。在這種情況下,這不是一個特例,不應該是一個例外。在這種情況下,您可以返回一個枚舉或一個Result對象,該對象的Status屬性設置爲枚舉(OK,Invalid,Incomplete)和具有特定屬性的Message屬性,如參數的名稱。

我會確保在開發過程中發現並修復這些類型的錯誤。您的質量檢查流程應仔細測試客戶端的有效和無效用途,並且您不希望將這些技術信息傳遞給客戶端。你想要做的是更新你的驗證系統,以防止無效數據進入服務調用。

我對任何WCF服務的假設是會有多個UI。現在可以是一個Web UI,但稍後我可以使用WinForms,WinCE或者甚至是本機iPhone/Android移動應用程序添加另一個,這與您對.NET客戶端的期望不一致。

2

您可能想要結合策略注入模塊link text查看MS模式和實踐企業庫驗證塊,它允許您使用驗證屬性裝飾您的數據合同成員並同時修飾服務實現,與WCF集成意味着驗證失敗會返回,因爲ArgumentValidationException會自動發生錯誤,每個驗證失敗都包含一個ValidationDetail對象。

使用與WCF的entlib你可以得到很多的驗證,錯誤報告,而無需編寫大量代碼

+0

對於任何感興趣的人,這裏是[鏈接](http://msdn.microsoft.com/en-us/library/ff953182(v = pandp.50).aspx)EntLib驗證塊入門指南。 – Crackerjack 2012-03-08 23:28:06

4

拋出異常從WCF服務是沒有用的爲什麼不呢?因爲它回來作爲裸故障,你需要

a)將故障,包括例外

B)解析故障得到異常的文字,看看發生了什麼。

所以是的,你需要一個故障,而不是一個例外。就你而言,我會創建一個自定義錯誤,其中包含未通過驗證的字段列表,作爲錯誤合同的一部分。

請注意,WCF用字典(它不是ISerializable)做有趣的事情;它有特殊的處理,所以檢查回來的消息看起來不錯,在電線上;如果沒有,它會回到你的陣列。