关于WSDL中soapenc:Array的使用问题

当我们用web service对外提供接口服务的时候,可能很多接口会返回复杂类型,比如数组; 在此次利用.Net下面WCF和我们ASSP API【Alisoft SaaS Platform API】进行联调的时候,就发现了问题;如果要想让通过WSDL发布的web service具有最大化的兼容性,最好是参考WS-I【Web Services Interoperability】标准,而不要仅仅局限于SOAP标准;以下就返回数组的问题进行下探讨;

ASSP API接口之一为getUsingUser,返回的对象为数组,数组元素也为复杂对象SimpleUserInfo,其中包括两个属性userId和userName;在WSDL声明此type的时候默认采用的是soapenc:Array的方式,这也是SOAP规范中的方式;其声明部分如下:
<xs:complexType name="ArrayOfSimpleUserInfo">
        <xs:complexContent>
            <xs:restriction base="soapenc:Array">
                <xs:attribute ref="soapenc:arrayType" wsdl:arrayType="ns1:SimpleUserInfo[]"></xs:attribute>
            </xs:restriction>
        </xs:complexContent>
</xs:complexType>
该声明方式在和大部分的客户端语言联调时没有问题,比如Java、.Net WSE 2.0、.Net WSE 3.0、Php;但是在利用WCF进行联调时就出现了问题,其表现为:1)在vs2008中通过Add Service Reference添加服务时不成功,生成的代理类为空;2)若通过命令行工具Svcutil生成,提示不成功,但能看到错误信息,提示如下:
System.ServiceModel.Description.XmlSerializerMessageContractImporter
错误: 引用类型“http://schemas.xmlsoap.org/soap/encoding/:Array”仅对编码的SOAP 有效。
经查,出现以上问题就是由于soapenc:Array的声明方式所导致,SOAP规范中的这种方式兼容性很不好,这点在WS-I BP【WS-I Basic Profile】中有过重点说明;后修改成unbounded模式后测试通过,修改后的声明方式为:
<xs:complexType name="ArrayOfSimpleUserInfo">
     <xs:sequence>
        <xs:element maxOccurs="unbounded" minOccurs="0" name="SimpleUserInfo" nillable="true" type="ns1:SimpleUserInfo" />
    </xs:sequence>
</xs:complexType>

soapenc:Array的问题解决之后,WCF环境下的联调并没有完全成功,还差一点点;WSDL声明修改之后,vs2008中添加服务引用正常了,调用服务端ws也正常了,在responseXml中返回了正常的结果,但是WCF对responseXml解析出来的结果却有问题,userId为null,userName正常,难道userId的信息丢掉了!后经MS人员查证之后是由于WSDL中声明SimpleUserInfo中属性信息和soap responseXml中属性信息的先后顺序不一致所导致!为了不让ISV修改客户端生成的代码,所以只好修改了服务端WSDL中userId、userName两者的顺序,之后问题全部解决;

总结下,虽然说web service说是完全跨平台的,但在实际开发过程中还是会出现很多的不兼容问题,这不仅仅是由于开发人员的代码编写上,连某些标准规范都是有瑕疵的,并不是说遵循了SOAP标准规范就没有任何问题了,至于这点,大家可以多参考WS-I标准,他里面指出了很多能够保证最大化兼容性的措施和方法,这会非常有用;

PS:以下列出相关参考连接
WS-I 基本概要中文版:http://www.ibm.com/developerworks/cn/webservices/ws-ibaseprof1.0/index.html
WS-I官网:http://www.ws-i.org/
WSDL:http://www.w3.org/TR/wsdl.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值