SOAP Webservice错误 - 设计实践

时间:2008-11-21 20:58:37

标签: web-services design-patterns soap

我需要设计一个SOAP api(我的第一个!)。有关返回给调用者的错误的最佳做法是什么。

假设api如下

[WebMethod]
public List<someClass> GetList(String param1)
{
}

我应该

  • 抛出异常。让SOAP基础结构生成SOAP错误 - 调用者必须尝试/ catch。这对调用者来说不是很明确
    1. 让return参数成为某种XMLDOcument,第一个元素是返回值,然后是List。
    2. 查看返回SOAP数据包,我看到生成的响应类似于以下内容
  

 <GetListResponse>
   <GetListResult>
     ...
     ...   
 </GetListResult>
</GetListResponse> 

我们可以以某种方式更改返回数据包,以便在出现错误时将“GetListResult”元素更改为“GetListError”

  • 还有其他方式吗?

谢谢!

4 个答案:

答案 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)
  • 当您的服务中抛出异常时,抓住它并在您的错误处理代码中,将信息添加到ErrorData类
  • 将序列化的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服务堆栈将异常(这是编写业务逻辑的“正确”方式)转换为正确编组的故障详细信息。我无法帮助你。