【发布时间】:2012-09-06 17:35:35
【问题描述】:
假设我有一个 WSDL,它定义了一个接受复杂类型的操作,非常常见的 webmethod 类似这样的东西:
<xs:element name="createBill">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="customer" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="billId" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<wsdl:message name="createBillRequest">
<wsdl:part name="parameters" element="ns:createBill" />
</wsdl:message>
<wsdl:operation name="creatBill">
<wsdl:input wsaw:Action="urn:createBill" message="axis2:createBillRequest" />
...
</wsdl:operation>
两种不同调用的 WebServices 标准实现规则是什么,一个指定 billId 为xsi:nil,另一个完全省略节点?
<creatBill ...>
<customer>1332400</customer>
<billId xsi:nil="true"/>
</createBill>
vs
<creatBill ...>
<customer>1332400</customer>
</createBill>
为了透露更多背景信息,我遇到了一位 Java 人员的问题。他的 Web 服务是在 Axis2 中完成的,并且(出于对我来说奇怪的原因)处理 bill 元素的省略与 nil 值不同。我的主张是它们是相同的,并且在两种情况下它的行为都应该相同(例如,创建一个动态的 billID)。他的说法是它不一样,他只在节点丢失时生成动态 ID,否则在节点被取消时返回错误(“billId 丢失”)。
我对他的说法的实际问题是 .NET 中的 WCF 和 WS 堆栈都将它们视为一回事,甚至没有规定省略可空参数,这使我几乎不可能实现客户端无需编写我自己的 WS-stack 以及他实现的 WS-Security。就目前而言,我只能调用指定 null 的服务:
serv.createBill("1332400", null);
serv.createBill("1332400"); // ERROR: no such method
我什至不明白他是如何在 Java 中实现服务器端的,因此一个 Web 方法具有不同的调用模式,当省略节点时,Axis2 设置的 billID 参数是什么?他非常不合作,我需要一些论据(如果有的话)向他提出,然后再向他的经理提出,因为他们签订了支持合同。
既然我们不能都对,有谁知道这里的 WS 标准规定了什么?谁对标准有过错?我不是开始讨论 wcf 与轴火焰(请不要),我需要从 SOAP/WSDL 标准和规范的角度来看待这个问题,作为两者的父级。
【问题讨论】:
标签: c# wcf web-services soap axis2