2014-02-17 69 views
0

我的Wcf服務有以下接口;Wcf服務如何以同樣的方法返回不同的對象

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    [XmlSerializerFormat] 
    [WebInvoke(Method = "POST", UriTemplate = "/GetTypes", BodyStyle = WebMessageBodyStyle.Bare)] 
    object GetTypes(RequestObject RequestObject); 

} 

我的服務看起來像這樣;

public class Service : IService 
{ 
    public static GetTypes(RequestObject RequestObject) 
    { 
     if(RequestObject.Validate) 
     { 
      //create a new response obj, and return it 
      ResponseObj oResponseObj = new ResponseObj(); 
      //get some data from data source and populate object, then return it 
      return oResponseObj; 
     } 
     else 
     { 
      //error response 
      ErrorResponseObj oErrorResponseObj = new ErrorResponseObj(); 
      oErrorResponseObj.ErrorId = 1; 
      oErrorResponseObj.ErrorMessage = "There was a error"; 
      return oErrorResponseObj; 
     } 
    } 
} 

我響應對象

[DataContract] 
public class ResponseObj 
{ 
    [DataMember]   
    public int Id {get;set;} 

    [DataMember] 
    public List<string> Names {get;set;} 
} 

我也有喜歡

[DataContract] 
public class ErrorResponseObj 
{ 
    [DataMember]   
    public int ErrorId {get;set;} 
    [DataMember] 
    public string ErrorMessage {get;set;} 
    [DataMember] 
    public string MessageImportance {get;set;} 
} 

如何最好的,我應該回到這些不同對象的WCF方法的錯誤響應。我應該返回類型對象嗎?或者有更好的選擇,或者這是正確的方法。

回答

1

標準的方式做這樣的事情是使用FaultContractAttribute。錯誤合約允許您指定將在SOAP Fault內返回的備用響應。 Philippe Truche給出了一個很好的例子,說明這些線在on his blog上的外觀。

實例接口:

[ServiceContract] 
interface IService 
{ 
    [OperationContract] 
    [FaultContract(typeof(ErrorResponseObj))] 
    ResponseObj GetObj(); 
} 

服務:

class Service : IService 
{ 
    public ResponseObj GetObj() 
    { 
     if (success) 
     { 
      return new ResponseObj(); 
     } 
     else 
     { 
      throw new FaultException<ErrorResponseObj>(new ErrorResponseObj() 
      { 
       ErrorMessage = "Something Happened" 
      }) 
     } 
    } 
} 

的客戶端可以通過捕獲FaultException<ErrorResponseObj>處理故障:

var serviceProxy = new ServiceProxy(); 

try 
{ 
    var dataObj = serviceProxy.GetObj(); 
} 
catch (FaultException<ErrorResponseObj> error) 
{ 
    ErrorResponseObj detail = error.Detail; 
    Console.WriteLine(detail.ErrorMessage); 
} 
0

你可以聚合成一個類型:

[DataContract] 
public class ResponseObj 
{ 
    [DataMember]   
    public int ErrorId {get;set;} 
    [DataMember] 
    public string ErrorMessage {get;set;} 
    [DataMember] 
    public string MessageImportance {get;set;} 
    [DataMember] 
    public int Id {get;set;} 
    [DataMember] 
    public List<string> Name {get;set;} 
} 

然後你會檢查是否ErrorID中> 0,否則沒有任何錯誤。

另一種方法是拋出一個錯誤異常在WCF服務,所以它會在 客戶端處理:

http://blogs.msdn.com/b/endpoint/archive/2011/01/14/wcf-spike-faultcontract-faultexception-lt-tdetail-gt-and-validation.aspx

+0

我已經更新我的問題,以反映這一點。 – Tommassiov

+0

我已經更新了我的答案:) –

+0

有沒有更好的選擇,或者是正常的做法... – Tommassiov

相關問題