Wcf服务如何以同样的方法返回不同的对象
我的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方法的错误响应。我应该返回类型对象吗?或者有更好的选择,或者这是正确的方法。
回答:
标准的方式做这样的事情是使用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);
}
回答:
你可以聚合成一个类型:
[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
以上是 Wcf服务如何以同样的方法返回不同的对象 的全部内容, 来源链接: utcz.com/qa/264834.html