织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>杂项技术>.NET(C#)>

用Soap Toolkit调用WebService的一个问题

罗索客 发布于 2005-10-28 13:57 点击:次 
问题描述:br/br/在用非.NET客户端调用WebService中,按照使用Soap Toolkit中的指导实现起来很简单,但在实际使用过程中却发现一个问题。br/假如Webservice提供的方法是:int SimpleMath.Add(int n1,int n2),返回值是n1+n2, 但按照soap toolkit提供的例子,使用VC进行
TAG:

问题描述:<br/><br/>在用非.NET客户端调用WebService中,按照使用Soap Toolkit中的指导实现起来很简单,但在实际使用过程中却发现一个问题。<br/>假如Webservice提供的方法是:int SimpleMath.Add(int n1,int n2),返回值是n1+n2, 但按照soap toolkit提供的例子,使用VC进行调用,得到的返回值却是0。<br/><br/>记录下我的解决过程,备忘。<br/><br/>试验环境:<br/>OS:WindowsXP Professional<br/>WebService:VS.NET 2003<br/>WebService运行环境:IIS<br/>客户端:VC6.0,VS.NET中的VC<br/>SoapToolkit SDK:3.0<br/><br/>问题再现:<br/>看Toolkit中稍微修改一下之后的例子代码:<br/><br/>#include <stdio.h><br/>#import "msxml4.dll" <br/>using namespace MSXML2;<br/>#import "C:\\Program Files\\Common Files\\MSSoap\\Binaries\\mssoap30.dll"             exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER",                     "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")<br/>using namespace MSSOAPLib30;<br/><br/>int test2()<br/>{<br/><br/> ISoapSerializerPtr Serializer;<br/> ISoapReaderPtr Reader;<br/> ISoapConnectorPtr Connector;<br/> <br/> // Connect to the service<br/> Connector.CreateInstance(__uuidof(HttpConnector));<br/> <br/><br/> Connector->Property["EndPointURL"] = "<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://localhost/WSTest/SimpleMath.asmx?WSDL">http://localhost/WSTest/SimpleMath.asmx?WSDL"<;/a>;;<br/> Connector->Connect();<br/> <br/> // Begin message<br/> Connector->Property["SoapAction"] = "<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/Add">http://tempuri.org/Add"<;/a>;;<br/> Connector->BeginMessage();<br/> <br/> // Create the SoapSerializer<br/> Serializer.CreateInstance(__uuidof(SoapSerializer));<br/> <br/> // Connect the serializer to the input stream of the connector<br/> Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));<br/> <br/> // Build the SOAP Message<br/> Serializer->startEnvelope("","","");<br/> Serializer->startBody("");<br/> Serializer->startElement("Add","<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;,"","");<br/> Serializer->startElement("n1","","","");<br/> Serializer->writeString("5");<br/> Serializer->endElement();<br/> Serializer->startElement("n2","","","");<br/> Serializer->writeString("10");<br/> Serializer->endElement();<br/> Serializer->endElement();<br/> Serializer->endBody();<br/> Serializer->endEnvelope();<br/> <br/> // Send the message to the web service<br/> Connector->EndMessage();      <br/> <br/> // Let us read the response<br/> Reader.CreateInstance(__uuidof(SoapReader));<br/> <br/> // Connect the reader to the output stream of the connector<br/> Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");<br/> <br/> // Display the result<br/> printf("Answer: %s\\n", (const char*)Reader->RPCResult->text);<br/> return 0;<br/>}<br/><br/><br/>返回结果应该是15,但实际却返回了0。<br/>在网上搜索发现有人提议把WebService的方法的参数改为string,然后在方法内部转换,我觉得这不是一个好办法。事实上,我经过发现,这样的实现问题会更多。<br/><br/>返回结果应该是15,但实际却返回了0。<br/>在网上搜索发现有人提议把WebService的方法的参数改为string,然后在方法内部转换,我觉得这不是一个好办法。事实上,我经过发现,这样的实现问题会更多。<br/>分析过程:<br/><br/>用soap toolkit的跟踪工具MSSoapT看一下,客户端到底向WebService发送了什么数据:<br/><br/><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="" xmlns:SOAP-ENV="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/"<;/a>;><br/> <SOAP-ENV:Body SOAP-ENV:encodingStyle=""><br/> <SOAPSDK1:Add xmlns:SOAPSDK1="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>; SOAP-ENV:encodingStyle=""><br/>  <n1 SOAP-ENV:encodingStyle="">5</n1> <br/>  <n2 SOAP-ENV:encodingStyle="">10</n2> <br/>  </SOAPSDK1:Add><br/>  </SOAP-ENV:Body><br/>  </SOAP-ENV:Envelope><br/><br/>再看看vs.NET调试中,IE浏览器发出的数据(模板):<br/><br/><br/><?xml version="1.0" encoding="utf-8"?><br/><soap:Envelope xmlns:xsi="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance"<;/a>; xmlns:xsd="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema"<;/a>; xmlns:soap="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/"<;/a>;><br/>  <soap:Body><br/>    <Add xmlns="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;><br/>      <n1>int</n1><br/>      <n2>int</n2><br/>    </Add><br/>  </soap:Body><br/></soap:Envelope><br/><br/>区别在哪里?soaptoolkit的数据中,多了个encodingStyle属性,尽管没有制定值。我们想办法屏蔽这个属性。<br/>在SoapSerializer30的startElement方法中的参数中按照如下方式调用,可以不制定这个属性。<br/>改代码如下:<br/><br/><br/>...<br/> Serializer->startElement("Add","<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;,"NONE","");<br/> Serializer->startElement("n1","","NONE","");<br/> Serializer->writeString("5");<br/> Serializer->endElement();<br/> Serializer->startElement("n2","","NONE","");<br/> Serializer->writeString("10");<br/> Serializer->endElement();<br/> Serializer->endElement();<br/>...<br/><br/><br/>但返回结果还是0,看来和encodingStyle无关。看看跟踪情况:<br/><br/><br/><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="" xmlns:SOAP-ENV="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/"<;/a>;><br/> <SOAP-ENV:Body SOAP-ENV:encodingStyle=""><br/> <SOAPSDK1:Add xmlns:SOAPSDK1="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;><br/>  <n1>5</n1> <br/>  <n2>10</n2> <br/>  </SOAPSDK1:Add><br/>  </SOAP-ENV:Body><br/>  </SOAP-ENV:Envelope><br/><br/>问题解决:<br/>比较一下vs.net中发出的请求,差别在哪里?认真看一下,n1和n2没有指定命名空间,那么就指定一下吧。<br/>把代码改成:<br/><br/><br/> Serializer->startElement("Add","<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;,"NONE","");<br/> Serializer->startElement("n1","<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;,"NONE","");<br/> Serializer->writeString("5");<br/> Serializer->endElement();<br/> Serializer->startElement("n2","<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;,"NONE","");<br/> Serializer->writeString("10");<br/> Serializer->endElement();<br/> Serializer->endElement();<br/><br/>测试结果正常了,返回15。<br/><br/>看看这时候发出的xml数据:<br/><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="" xmlns:SOAP-ENV="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/"<;/a>;><br/> <SOAP-ENV:Body SOAP-ENV:encodingStyle=""><br/> <SOAPSDK1:Add xmlns:SOAPSDK1="<img align=absmiddle src=/sys_images/FileIcon/url.gif border='0'><a TARGET='_blank' href=http://tempuri.org/">http://tempuri.org/"<;/a>;><br/>  <SOAPSDK1:n1>5</SOAPSDK1:n1> <br/>  <SOAPSDK1:n2>10</SOAPSDK1:n2> <br/>  </SOAPSDK1:Add><br/>  </SOAP-ENV:Body><br/>  </SOAP-ENV:Envelope><br/><br/>原因:<br/><br/>我也无法总结到底是谁的问题:(<br/><br/>也许是VS.NET的问题,也许是SoapToolKit的问题,也许是他提供的例子自身就有问题,也许是我的运行环境有问题,当然,更也许是我还没有真正理解xml的命名空间或没有正确使用WebService。 (iwgh)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200510/2376.html]
本文出处: 作者:iwgh
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容