我需要设计一个SOAP api(我的第一个!)。有关返回给调用者的错误的最佳做法是什么。
假设api如下
[WebMethod]
public List<someClass> GetList(String param1)
{
}
我应该
<GetListResponse>
<GetListResult>
...
...
</GetListResult>
</GetListResponse>
我们可以以某种方式更改返回数据包,以便在出现错误时将“GetListResult”元素更改为“GetListError”
谢谢!
答案 0 :(得分:2)
可能最合适的SOA模式可能是Fault Contract,它本质上是一个包含在SOAPException中的Data Contract。
我在.NET中发布示例,因为它看起来就像你正在使用的那样(这就是我所知道的:))
在WCF中,您可以定义DataContract,然后使用“FaultContract”属性修饰您的OperationContract接口,该属性将其指定为返回值:
public partial interface MyServiceContract
{
[System.ServiceModel.FaultContract(typeof(MyService.FaultContracts.ErrorMessageFaultContract))]
[System.ServiceModel.OperationContract(...)]
ResponseMessage SOAMethod(RequestMessage request) {...}
}
对于ASMX Web服务(因为您使用的是代码片段),您无法使用此属性或设置。因此,要实现该模式,您需要:
将序列化的ErrorData类附加到SoapException类:
SoapException mySoapException = new SoapException(message, SoapException.ServerFaultCode, "", serialzedErrorDataClass);
在代码中抛出SoapException
有点似乎很多工作,但这样你就可以完全控制返回的数据。顺便说一句,这是来自Microsoft模式&amp;的ServiceFactory使用的模式。 ASMX Web服务的实践。
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以从旧的ASMX服务返回正确的错误,但这并不容易。首先,您必须手动编写WSDL代码,因为ASMX基础结构永远不会在WSDL中创建Fault元素。然后,您必须将所需的故障数据序列化为XmlElement,然后将其作为您将抛出的SoapException的Detail属性提供。
使用WCF会更容易。您可以为每个操作声明一些FaultContracts,WCF将生成正确的WSDL以引用它们。然后,您只需抛出一个FaultException,其中类型T是FaultContract的类型。将T实例传递给构造函数,然后就完成了设置。
答案 3 :(得分:0)
我不能给你指定.net(这似乎是你所要求的),但SOAP提供了一种表达强类型异常的机制。 SOAP fault元素可以有一个可选的FaultDetail子元素,它可以包含任意XML文档,例如GetListError。这些文档类型应该在WSDL中定义为wsdl:operation中的wsdl:fault
诀窍是说服Web服务堆栈将异常(这是编写业务逻辑的“正确”方式)转换为正确编组的故障详细信息。我无法帮助你。