2011-01-19 113 views
2

向呼叫結果提供wcf客戶端時,更好的方法是什麼?WCF呼叫結果

1.包裝紙的結果中的對象

public enum DefinedResult : short { 
     Success = 0, 
     TimeOut = 1, 
     ServerFailure = 2, 
     UserNotFount = 3, 
     Uknown = 4, 

     //etc. 
    } 

    [DataContract]  
    public class ServiceResult { 

     readonly DefinedResults dResult; 

     public ServiceResult(DefinedResult result) { 

      this.dResult = result; 
     } 
     [DataMember] 
     public bool IsSuccess 
     { 
      get {return this.dResult == DefinedResult.Success;} 
     } 

    } 



    //Client: 

    WcfClient client = new WcfClient(); 
    ServiceResult result = client.DoWork(); 

2.投擲定製例外:

[Serializable] 
    public UserNotFoundException: Exception { 

     public UserNotFoundException(string message): base(message) {} 

    } 


    //client: 
    WcfClient client = new WcfClient(); 
    try { 
    result = client.DoWork(); 
    } 
    catch(FaultException<ExceptionDetail> ex) { 

     switch(ex.Detail.Type) 
     { 
      case "MyCompany.Framework.Exceptions.UserNotFound": 
      //handle 
      break; 
      case "MyCompany.Framework.Exceptions.ServerError": 
      //handle 
      break; 
     } 
    } 

現在,客戶機可以是其他.NET處理(服務器側)或者相同的服務可以被java腳本調用,因此這個問題 - 哪一個(或者可能有更好的方法)是讓客戶知道該調用發生了什麼的更好方法?

+1

如果拋出 - 確保拋出一個** FaultException **(或** FaultException **) - 不只是一個常規的.NET異常 - 這些都是**不可**互操作! – 2011-01-19 20:48:48

回答

4

首先,這取決於:如果你想返回的條件是也不例外,然後用結果值。否則,請使用例外。在WCF中,它是這樣的:

創建一個自定義異常類:

[DataContract] 
class MyException : FaultException<mydetails> 

定義您的服務拋出它:

[FaultContract(...)] 
void mymethod()... 

throw MyException在服務方法

然後你可以在服務方式中發現異常,如catch FaultException<mydetails>

這是最好的方式。

+1

遵循你的方法,我現在得到這個,每當我嘗試創建一個ref的服務時:System.Runtime.Serialization.InvalidDataContractException:類型'MyCo.Framework.Utilities.ChangePwdService.MyFaultException'不能ISerializable並且具有DataContractAttribute屬性。 – dexter 2011-01-20 20:26:39

1

FaultExceptions被WebHttpBinding吞噬(對於JSON/REST服務是必需的)。在這種情況下,如果你想爲你的客戶提供詳細的信息,選項1更好。

如果JSON是不是在路上,我建議選擇2