zoukankan      html  css  js  c++  java
  • delphi调用WEBservice (转)

    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。
  • 相关阅读:
    C语言基础知识-程序流程结构
    C语言基础知识-运算符与表达式
    Cloudera Certified Associate Administrator案例之Configure篇
    Python入门篇-文件操作
    gif软件(ShareX)
    BareTail(日志查看工具)
    [UGUI]游戏中的Tips贴图标边缘显示(贴边)
    Lua中的#
    ugui SetParent在安卓上一个诡异bug
    .svn文件夹特别大
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/3096700.html
Copyright © 2011-2022 走看看