SOAP Web服务错误 - 设计实践

4

我需要设计一个SOAP API(我的第一个API!)。关于返回给调用者的错误,请问有哪些最佳实践?

假设API如下:

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

我应该

  • 抛出异常,让SOAP基础设施生成SOAP故障--调用者必须尝试/捕获。这对调用者来说不是很解释清楚。
    1. 将返回参数设置为某种XML文档,其中第一个元素是返回值,然后是列表。
    2. 查看返回的SOAP数据包,我发现生成的响应如下所示:

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

我们是否可以在出现错误的情况下改变返回数据包,使得"GetListResult"元素变为"GetListError"?

  • 还有其他方法吗?

谢谢!


1
很遗憾这个问题没有得到更多的回答:我正准备问一个非常类似的问题。但是既然你已经问过了,而且没有得到太多的回应,我认为再问一次就没有意义了 :( - jkp
我同意回答不够。但你可以再问一次,也许会得到更多的关注。 - LeJeune
4个回答

2

可能最适合遵循的SOA模式是故障契约,它本质上是一个包装在SOAPException中的数据契约。

我将以.NET为例进行演示,因为看起来这是您正在使用的语言(而且这也是我知道的)。

在WCF中,您可以定义一个DataContract,然后在操作契约接口上使用“FaultContract”属性指定它作为返回值:

public partial interface MyServiceContract
{
    [System.ServiceModel.FaultContract(typeof(MyService.FaultContracts.ErrorMessageFaultContract))]
    [System.ServiceModel.OperationContract(...)]
    ResponseMessage SOAMethod(RequestMessage request) {...}
}

针对 ASMX web 服务(从您的代码片段中看来您在使用此服务),您无法使用此属性或设置。因此,要实现该模式,您需要执行以下操作:

  • Define a serializable class to hold your exception information (i.e. ErrorData)
  • When an exception is thrown in your service, catch it and in your error handling code, add the info to the ErrorData class
  • Append the serialized ErrorData class to a SoapException class:

    SoapException mySoapException = new SoapException(message, SoapException.ServerFaultCode, "", serialzedErrorDataClass);
    
  • Throw the SoapException in your code

  • On your client side, you will need to deserialize the message to interpret it.

看起来需要做很多工作,但这样你就可以完全控制返回的数据。顺便说一下,这是微软模式和实践中的ServiceFactory用于ASMX web服务的模式。



1

你可以导致旧的 ASMX 服务返回正确的故障,但这并不容易。首先,你必须手工编写 WSDL,因为 ASMX 基础架构永远不会在 WSDL 中创建 Fault 元素。然后,你必须将所需的故障数据序列化为 XmlElement,并将其作为 SoapException 的 Detail 属性提供。

使用 WCF 更容易。你可以为每个操作声明多个 FaultContracts,WCF 将生成正确的 WSDL 来引用它们。然后,你只需抛出一个 FaultException,其中类型 T 是 FaultContract 的类型。将 T 实例传递给构造函数,就可以了。


0

我无法为 .net 提供具体的规范(这似乎是您在询问的内容),但 SOAP 提供了一种表达强类型异常的机制。SOAP 故障元素可以有一个可选的 FaultDetail 子元素,它可以包含任意 XML 文档,例如您的 GetListError。这些文档类型应该在 WSDL 中定义为 wsdl:operation 内部的 wsdl:fault。

关键是说服 Web 服务堆栈将异常(这是编写业务逻辑的“正确”方式)转换为正确编排的故障详细信息。对于这一点,我无法帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接