• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

delphi调用WEBservice(转)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap