WSDL 中的 Fault 元素声明有什么用?

What's the Fault element declaration in WSDL good for?

在 WSDL 中,wsdl:Fault 元素声明服务可能 return 的 SOAP 错误消息的结构。或者更准确地说,它声明了 SOAP 故障消息的 <detail> 元素的结构。

问: wsdl:Fault 声明的确切目的是什么?它是否指定 SOAP 错误消息详细信息 必须 具有已声明的名称空间和结构?或者它是否指定 SOAP 错误消息详细信息 通常 具有已声明的名称空间和结构?换句话说,如果 SOAP 服务 returns SOAP 因 <detail> 元素的结构而出错,该元素的命名空间不是在 WSDL 中声明的,那么消息对于 WSDL 是否无效?

在我看来,wsdl:Fault声明只是一个建议。 SOAP 错误可能 return 由另一层而不是服务本身(例如代理网关)编辑,并且该层可能 return SOAP 错误详细信息中的任意内容。因此我推断,如果服务实现 return 的错误详细信息与 WSDL 中声明的不同,应该没问题,对吗?

我没有找到我的问题的任何明确答案。但是根据互联网上各种文档的各种提示,我推断:

  1. 故障消息可以包含 <detail> 元素的任意数量的子元素。即使是没有在 WSDL 中声明的细节结构。参见例如Example 16-6.
  2. 在 WSDL 中声明的故障被视为 modeled faults, others are unmodeled faults. Modeled faults represent business logic faults, the other faults usually represent runtime/technical faults (see here)。
  3. <detail> 元素下有多个元素并不与 WS-I Basic Profile 相矛盾。特别是,要求 R1002 说:

R1002: A RECEIVER MUST accept faults that have any number of elements, including zero, appearing as children of the detail element. Such children can be qualified or unqualified.

所以,总结一下:

服务应该return 为业务错误建模故障。消费者可能会以特殊方式处理这些建模故障,例如使用修改后的参数重试请求。未建模故障主要用于技术错误、验证错误和其他运行时错误。

当您开始 return 未建模故障而不是建模故障时,您可能会破坏消费者应用程序的业务逻辑。