4

假设我们有一个使用 WSDL 复杂类型扩展的 Web 服务。考虑下面的(有效的 WSDL)示例,其中Vechicle是抽象的。两种类型,CarBike,从它继承:

<xs:complexType name="Vehicle" abstract="true">
  <xs:sequence>
    <xs:element name="common1" type="xs:string" minOccurs="0"/>
    <xs:element name="common2" type="xs:string" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="Car">
  <xs:complexContent>
    <xs:extension base="tns:Vehicle">
      <xs:sequence>
        <xs:element name="carValue1" type="xs:string" minOccurs="0"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
<xs:complexType name="Bike">
  <xs:complexContent>
    <xs:extension base="tns:Vehicle">
      <xs:sequence>
        <xs:element name="bikeValue1" type="xs:string" minOccurs="0"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

以及Transport使用该Vehicle类型作为其元素之一的类型:

<xs:complexType name="Transport">
  <xs:sequence>
      <xs:choice>
        <xs:element ref="tns:Car"/>
        <xs:element ref="tns:Bike"/>
      </xs:choice>
    <xs:element name="description" type="xs:string"/>
</xs:sequence>
</xs:complexType>

请注意,Vehicle它本身不是内部可能的类型Transport,这当然是因为Vehicle它是抽象的。在 Java Metro 堆栈中很容易生成上述内容。Blaise Doughan 的博客在这里给了我一些宝贵的意见。

我的问题是这将如何在 Web 服务互操作性方面发挥作用,特别是与WS-I Basic Profile相关。我可以确定符合 WS-I 的 Web 服务框架能够使用这样的 Web 服务吗?. 我知道 WS-I 基本上只指定了 WSDL 中允许的内容的一个子集。我已经尝试阅读 WS-I 规范来理解这个问题,但没有真正的运气。语言对我来说太难了。我发现一篇 2004 年的文章引起了一些担忧:

这种关注的基本原因是值对象继承的扩展机制的使用超出了 WS-I 基本配置文件,尽管它没有明确排除在外。目前,没有提到在 WS-I 基本概要文件中使用扩展构造,此外,WS-I 合规性测试套件也没有涵盖这种情况。

...但那是在 2004 年,显然与 WS-I Basic Profile v1.0 有关。从那时起,WS-I Basic profile 1.1、1.2 和 2.0 规范已经发布。

所以问题是:使用 WSDL 值类型扩展特性(即<xs:complexType name="xxx" abstract="true"><xs:extension base="xxx">)的 Web 服务是否可以在所有声称符合WS-I Basic Profile 的框架中工作?他们可以使用这样的网络服务吗?

4

1 回答 1

1

WS-I Basic Profile对 xml 进行了以下说明:

概要文件使用 Web 服务描述语言 (WSDL) 将服务描述为对消息进行操作的端点集。本概要的这一部分通过引用合并了以下规范 (...):XML 模式第 1 部分:结构

所以它引用 XML Schema 作为它的基础。在那里,你会发现

抽象复杂类型可以用作{基本类型定义},甚至可以用作元素声明的{类型定义},只要通过 xsi:type (§ 2.6.1) 或替代组的操作。

此外,它定义<extension base="QName">文档有很多话要说的结构。

但这一切都是在概念层面上,不一定直接将其与对象继承相关联。虽然进行这样的映射可能并不太难(并且您的链接准确地表明了这一点),但它也没有严格定义。我想这就是他们在提出担忧时所谈论的内容。

所以从技术和句法上讲,构造是标准的一部分,但实现可能会以不可预见的方式处理它。另一方面,遵循该标准的工具应该能够接受和输出有效的 WS-I XML,并按照XML 标准中的规定执行验证。

最后,我想说任何不能以某种方式处理您的构造的工具都不是有效的 WS-I 实现。

于 2012-12-14T02:53:54.990 回答