【问题标题】:Web Services interoperability - wsdl complex type extensionWeb 服务互操作性 - wsdl 复杂类型扩展
【发布时间】:2012-09-21 00:47:15
【问题描述】:

假设我们有一个使用 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>

还有一个使用Vehicle 类型作为其元素之一的类型Transport

<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's blogs 在这里给了我一些宝贵的意见。

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

引起这种担忧的根本原因是使用了扩展 值对象继承机制在 WS-I 基础之外 profile,尽管它没有明确排除。目前,有 没有提到在 WS-I 基本概要文件中使用扩展构造 而且,另外,WS-I 合规性测试套件不包括这个 案例。

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

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

【问题讨论】:

    标签: asp.net web-services jax-ws axis2 java-metro-framework


    【解决方案1】:

    WS-I Basic Profile 对 xml 说如下:

    Profile 使用 Web 服务描述语言 (WSDL) 将服务描述为对消息进行操作的一组端点。本配置文件的这一部分通过引用 (...) 包含以下规范:XML Schema Part 1: Structures

    所以它引用 XML Schema 作为它的基础。 In there, you'll find:

    抽象复杂类型可以用作{基本类型定义},甚至可以用作元素声明的{类型定义},只要通过 xsi 使用具体派生类型定义来进行·验证·:类型(第 2.6.1 节)或替换组的操作。

    此外,it defines 构造 &lt;extension base="QName"&gt; 文档有很多话要说。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多