2011-09-26 75 views
2

我被要求使用WCF實現web服務,該服務將返回一個標準的響應對象,該對象指示Web服務調用是成功還是失敗,並返回錯誤消息(如果發生的話)。使用單個標準響應對象創建WCF web服務

它在我看來這不是如何打算使用WCF,是否正確?

我的問題是,我正在使用IDispatchMessageInspector.AfterReceiveRequest()在WCF反序列化並調用我的操作之前對XSD驗證請求。

如果驗證失敗,我該如何返回標準響應對象? WCF似乎希望我在這種情況下拋出FaultException,但我希望接口純粹返回一個包含任何失敗信息的標準響應對象。

所以這意味着你需要定義一個自定義的Fault Exception,當你接收到的請求在反序列化之前驗證失敗時,你可以拋出異常並且在請求成功時發送第二個標準響應。

那是正確的做法?我試圖在AfterReceiveRequest()中作弊並設置請求對象爲null,所以它跳過了處理請求的過程。爲了實現我的目標,簡單地返回一個單一的響應對象。

object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
     { 
      try 
      { 
       validateMessage(ref request); 
      } 
      catch (Exception e) 
      { 
       request = null; 
       return new FaultException<string>(e.Message); 
      } 
      return null; 

     } 

然後也許我可以在BeforeSendReply()中創建自己的自定義響應對象。

void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
     { 
      if (correlationState != null) 
      { 
       reply = CreateMyOwnResponse(((FaultException) correlationState)); 
      } 
     } 

但我知道這似乎很愚蠢,並且正在反對WCF如何最有可能被使用。有什麼方法可以很好地實現我想要做的事情嗎?當事情變糟時,我必須發送異常類型,並在事情成功時發送不同的「正常」響應。

回答

3

WCF不會限制返回對象或強制您拋出異常來傳達錯誤的條件。這取決於您在架構中整體規模上的需求和協議。

在我的應用程序中,我總是傾向於有一個int類型的返回參數,該參數在發生錯誤時變爲負值,在操作成功完成時變爲零。你也可以有一個有錯誤的結構在其中更加複雜的返回參數,如:

[DataContract] 
public class ReturnValue 
{ 
    [DataMember] 
    public int ReturnCode; 

    [DataMember] 
    public string ResultingDescription; 

    // enum listing severities like Critical, Warning, etc. 
    [DataMember] 
    public Severity Severity; 
} 

如果您需要複雜的返回參數爲您的操作的回報,你可以有以下特徵:

[OperationContract] 
ReturnValue MyOperation (int param1, string param2, out MyOperationResult result); 

我經驗法則是:

  1. 只對服務邊界拋出異常和未處理的異常(在開發時您沒有想到的事情)

  2. 對於所有其他情況下,使用您的操作的返回值返回錯誤代碼(這是不是這方面的異常)

+0

感謝kroonwijk!我想我應該改變我的問題,特別是在使用IDispatchMessageInspector.AfterReceiveRequest的情況下,在對數據庫進行反序列化並調用我的操作之前驗證請求XML。如果此時發生XML驗證錯誤,我該如何返回您的ReturnValue類而不是拋出異常?這是我應該做的事嗎? – TerryB