.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. 

至此问题搞定了。

原文地址:https://www.cnblogs.com/mobile/p/386274.html