不同的Webservices实现架构对标准的实现上确实存在诸多的不同,这就是我们在联调系统的时候时常发现无法调通的关键。本文讨论的就是其中的一支,关于Xfire、Axi2在执行W3C "WSDL 1.1 Binding Extension for SOAP 1.2"时的差异,了解了这些有助于我们发现问题,解决问题。
开始之前,需要做些准备:
1、W3C"WSDL 1.1 Binding Extension for SOAP 1.2",可在http://www.w3.org/Submission/wsdl11soap12/ 获得
2、W3C Team Comment on "WSDL 1.1 Binding Extension for SOAP 1.2",可在http://www.w3.org/Submission/2006/05/Comment获得
3、Xfire1.26安装包(安装过程略)
4、Axis2/Java 1.3安装包(安装过程略)
5、一个TcpTrace,我用的这个http://www.pocketsoap.com/tcpTrace/
6、编写Xfire服务端程序,支持SOAP1.2。详见http://blog.youkuaiyun.com/leo_fanaq/archive/2008/01/26/2067366.aspx
7、Axis2/Java 1.3使用自带例子StockQuoteService
8、Xfire1.26、Axis2/Java 1.3默认是使用WSDL1.1,不做调整。
准备工作就绪后,我们开始工作:
1、W3C对WSDL1.1绑定SOAP1.2的规范中,有如下阐述:







以上这些是W3C在WSDL1.1基础上扩展对SOAP1.2的支持的必要条件,我们分别与Xfire、Axis2/Java生成的WSDL做比较分析。












-------------------------------------------------------------------------------------------------------------------------
xs http://www.w3.org/2001/XMLSchema [XML Schema Part 1, Part 2]


这个估计是现在制约系统间联通的最表象的、也是最关键的问题,另外关于这部分W3C也出了一份额外的解释:W3C Team Comment on "WSDL 1.1 Binding Extension for SOAP 1.2"。



但是在W3C的另外一份文件(http://schemas.xmlsoap.org/wsdl/soap12/)中是这样说的,真是有混淆视听之嫌:









另外关于prefix,我不是教条主义者,自定义也无妨。










































这部分是现在很多WSDL2JAVA无法生成客户端的原因所在,"?" (0 or 1) "*" (0 or more) "+" (1 or more) 。
2、首先看Xfire生成的WSDL1.1绑定SOAP1.2报文(如果<property name="createDefaultBindings" value="true" />则通过WSDL地址获取到的是SOAP1.1的报文,但SOAP1.2还是可以使用的)
W3C建议在WSDL1.1基础上对SOAP1.2进行扩展支持,但不同于Axis2/Java执行标准,Xfire使用了不同的处理方法,将SOAP1.1绑定与SOAP1.2绑定分割开来,但对SOAP1.2所生成的WSDL还是1.1版本。这样不得不讲是便利于用户的,用户可以自行选择是否开启SOAP1.1亦或SOAP1.2,而不像Axis2/Java只支持通过distableSOAP12参数关闭对SOAP1.2的支持。这里我给Xfire加分,虽然它不符合W3C标准。
接下来我们看看报文详情:




























































<!--NO W3C, wsdl:binding is MUST for SOAP1.2 with WSDL1.1-->

<!--NO W3C,wsdl:port is NUST for SOAP1.2 with WSDL1.1-->
</ wsdl:service >



















































































































































综上所述,我们可以看到Xfire就像一只桀骜不驯的“野马”,做事并非规矩,然而Axis2显得中庸的多。对于在项目中如何选择,我更倾向于中庸的做法,毕竟是多个厂家协调的事情,还是有一套国际认可的标准为宜。以后我们还会分析WSDL2.0下各家架构的异同。