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

至此问题搞定了。

你可能感兴趣的:(web services)