• .NET 2.0 Web Services的bug?


    今天测试.net 2.0的WebService,发现了一个大问题。就是无法获取参数,参数永远是null。当然了使用.net调用没有任何问题,web测试页也正常。不论是Delphi7还是java调用的结果的都是一样的,难道是.net 2.0的Bug?

    测试结果发现:值类型参数全部为缺省值,引用类型全部为null

    WebService的代码如下:

        [WebMethod]
        
    public string EchoString(string args)
        {
            
    return args;
        }

        [WebMethod]
        
    public string EchoInt(int args)
        {
            
    return args.ToString();
        }



    delphi调用的代码

    procedure TForm1.Button3Click(Sender: TObject);
    var
      ss:ServiceSoap;
      hello:WideString;
    begin
      
    try
        HTTPRIO1.WSDLLocation :
    = edtAddress.Text;
        HTTPRIO1.Service :
    = edit3.Text;
        HTTPRIO1.Port :
    = edit4.Text;

        ss :
    = (HTTPRIO1 as ServiceSoap);
        hello:
    = 'hello';
        Memo1.Lines.Add(ss.EchoInt(
    234));
      except
        on e : exception 
    do
              showmessage(e.Message);
      end;
    end;

    --------------------------------------------------------------------------------------------------------------------------------------------------

    在不断尝试中发现vs2003生成的web Services,delphi调用的时候不会有任何问题,即使是delphi2006也无法正常调用.net 2.0的Web Service.

    最后经过不懈努力,终于找到方法那就是在delphi生成webservices声明单元中加入以行
    InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);

    如:

    unit Service;

    interface

    uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

    type
      ServiceSoap 
    = interface(IInvokable)
      [
    '{77573149-9C57-FA51-F11F-EFD527C91BD9}']
        function  HelloWorld(
    const asdf: WideString): WideString; stdcall;
      end;

    implementation

    type

      ServiceSoapImpl 
    = class(TInvokableClass, ServiceSoap)
      
    public
        { ServiceSoap }
        function  HelloWorld(
    const asdf: WideString): WideString; stdcall;
      end;

    function ServiceSoapImpl.HelloWorld(
    const asdf: WideString): WideString;
    begin
      { TODO 
    - Implement method HelloWorld }
    end;

    initialization
      InvRegistry.RegisterInterface(TypeInfo(ServiceSoap), 
    'http://tempuri.org/''utf-8');
      InvRegistry.RegisterInvokableClass(ServiceSoapImpl);
      InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap), 
    'http://tempuri.org/HelloWorld');
      InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);
    //就是这一行
    end. 

    至此问题搞定了。

  • 相关阅读:
    基数排序
    定时任务
    线程池的创建
    SharePoint 客户端对象模型 多选查阅项赋值
    Sharepoint Rest 根据user获取UserId
    SHAREPOINT
    plupload 实例
    JS 在web页面中调用本地应用程序
    Jquery ajax上传文件到服务器
    sharepoint 人员选择控件使用
  • 原文地址:https://www.cnblogs.com/mobile/p/386274.html
Copyright © 2020-2023  润新知