【发布时间】:2012-09-21 00:47:15
【问题描述】:
假设我们有一个使用 WSDL 复杂类型扩展的 Web 服务。考虑下面的(有效的 WSDL)示例,其中 Vechicle 是抽象的。两种类型,Car 和 Bike,继承自它:
<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 值类型扩展功能(即 <xs:complexType name="xxx" abstract="true"> 和 <xs:extension base="xxx">)的 Web 服务是否可以在所有声称符合 WS-I Basic Profile 的框架中工作?他们可以使用这样的网络服务吗?
【问题讨论】:
标签: asp.net web-services jax-ws axis2 java-metro-framework