Web服务互操作性 - wsdl复杂类型扩展

时间:2012-09-29 10:01:59

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

假设我们有一个使用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's blogs在这里给了我一些宝贵的意见。

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

这种担忧的基本原因是使用了扩展名 值对象继承的机制在WS-I基础之外 简介,虽然没有明确排除它。目前,有 没有提到在WS-I基本配置文件中使用扩展构造 此外,WS-I一致性测试套件不包括此内容 情况下。

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

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

1 个答案:

答案 0 :(得分:1)

WS-I Basic Profile说明以下关于xml的内容:

  

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

因此它将XML Schema引用为它所基于的东西。 In there, you'll find

  

抽象复杂类型可以用作{基本类型定义},甚至可以用作元素声明的{类型定义},在每种情况下都提供具体的派生类型定义用于验证·,通过xsi: type(§2.6.1)或替换组的操作。

此外,it defines该文档有很多话要说的构造<extension base="QName">

但所有这些都是概念层面的,不一定直接将它与对象继承相关联。虽然制作这样的映射可能并不太困难(并且您的链接确实显示了这一点),但它也没有严格定义。我猜这是他们在提出问题时所谈论的内容。

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

总而言之,我会说任何无法以某种方式处理构造的工具都不是有效的WS-I实现。