张志峰的博客

水滴石川,积少成多。

导航

delphi调用WEBservice (转)

Posted on 2013-05-24 13:39  ╰★张志峰★╮  阅读(2164)  评论(0编辑  收藏  举报

delphi调用WEBservice

 
客户端程序由delphi6开发,WEB SERVICE是VS2005(C#)写的。碰到的问题很多,大都GOOGLE都可以找到答案。但有些我还是重复一下,另外我碰到的一些问题也在这里备注一下。

刚开始是在Delphi6+sp1的环境下开发客户端程序,会出现Internal error(500)的错误或调用的web service的命名空间不正确,无法正确解析。解决办法是在用wsdl importer工具生成的代理类中插入以下两句话:

? InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap), 'http://www.qk.com/HelloWorld');//①
? InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);
①处方法的第二个参数HellowWorld前半部分表示web service类的命名空间,也就是在C#中定义的命名空间,代码片断如下:InvRegistry.RegisterInvokeOptions(TypeInfo(DataServiceSoap), ioDocument); 就报错,说InvRegistry没有RegisterInvokeOptions声明。解决办法是下载delphi6 sp2就可以了。
...
[WebService(Namespace:="http://www.qk.com/")
[WebServiceBinding(ConformsTo=WsiProfiles.None)]
[SoapRpcService(RoutingStyle=SoapServiceRoutingStyle.SoapAction)]
public class Service?
? ......

红色的两句代码非常重要,VS2005默认的web service binding值是BasicProfile1_1。否则在delphi调用web service返回的值总是空。另外在delphi6编译此句

这里贴出delphi6 sp下载的站点:http://se-ed.net/thaidelphicc/xml/updatepack/

参考文档:http://www.cnblogs.com/mobile/archive/2006/04/27/386274.html



补充:delphi的wsdl importer工具会根据wsdl url来自动生成代理类,那么如果对应的WEB SERVICE的方法调用方式是document,代理类中会自动产生InvRegistry.RegisterInvokeOptions(TypeInfo(XXXXSoap), ioDocument); 如果是以RPC方式调用,则不会产生此代码。之前没有产生,是因为没有装SP2的问题。

VS2005的web service binding =BasicProfile1_1是document方式, web service binding =None是RPC方式,可以在VS2005中将WEB SERVICE生成的WSDL文件中查看各个方法的调用方式,如果是RPC,则无需写InvRegistry.RegisterInvokeOptions(TypeInfo(XXXXSoap), ioDocument); 反之则要写。

后来我碰到传递参数给WEB SERVICE,服务器端接受到的参数总是为空,原因是用document的方式去调用RPC方式的WEB SERVICE。