至于为什么会导致参数增多的情况呢?经过测试发现只要是用C# .NET开发的WEB服务就不会出现此问题(这点也很容易理解,用C#工具发布,再由C#工具引用加载肯定不会有问题);而我们的geoweb服务是是用JAVA开发的,用C# .NET调用;出现问题也很正常。
该问题的产生背景:
.net向webservice传double、int、datetime到服务器,而得到的返回值为null的情况,比如用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型、double和DateTime类型的值(在服务端得到的均为null)。
解决办法:
VS2005封装WebService引用时,如果WebService发布的是一个基本数据类型组成的对象,则会对该对象的非string属性同时生成两个属性,一般是这样的"属性××"、"属性××Specified"。而"属性名Specified"是一个bool类型,只有这个属性被设置成true时,"属性××"的值才会被序列化成xml传递。
综上所述,参数增多是VS2005为了解决C# .NET调用JAVA开发的Web服务过程中服务端接收的参数为NULL的BUG。
故参数增多不会影响到程序的正确运行,传入的参数基本上多就是一些boolean(布尔);全部传true即可得到正确的结果
例如(SoapUI和VS2005调用web服务区别):
Ø 用SoapUI调用,接口参数是正常的;soapUI是用JAVA语言开发的,相当于是用JAVA调用web服务(该web服务的JAVA开发的)。
Request(请求串):
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://webservice.geoglobe.geostar.com">
<soap:Header/>
<soap:Body>
<web:getRightId>
<!--Optional:-->
<web:rightitem>添加</web:rightitem>
<!--Optional:-->
<web:rightparentid>1</web:rightparentid>
<!--Optional:-->
<web:sysid>1</web:sysid>
</web:getRightId>
</soap:Body>
</soap:Envelope>
-------------------------------------------------------------------------------------------------------
Resposne(返回信息串)
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<ns:getRightIdResponse xmlns:ns="http://webservice.geoglobe.geostar.com">
<ns:return>1</ns:return>
</ns:getRightIdResponse>
</soapenv:Body>
</soapenv:Envelope>
Ø 用VS2005调用加载进来的web服务,接口参数是变多了;用C#.NET调用web服务(该web服务的JAVA开发的)
接口:public void getRightId(string rightitem, int rightparentid, bool rightparentidSpecified, int sysid, bool sysidSpecified, out int return, out bool returnSpecified)
程序调用示例:
localRightManager.RightManagerWebService sa = new WindowsApplication1.localRightManager.RightManagerWebService();
int returnVal;
bool returnBoolVal;
sa.getRightId("添加",1,true,1,true,out returnVal, out returnBoolVal);
rightparentidSpecified设置为true是为了让服务端能正确的接收到rightparentid的值;
sysidSpecified设置为true是为了让服务端能正确的接收到sysid的值;
运行完此程序之后returnVal的值为1,returnBoolVal的值为true。
此例子说被VS2005加载进来的接口,参数确实增多了,这个接口参数增加了4个之多