今天测试.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. 至此问题搞定了。
但是经过我的测试发现,还是不行.......找到了其他原因问题 解决了, 在用VS2005写的WebService的类属性中加入SoapRpcServiceAttribute属性就可以了。 如 下: [SoapRpcService(RoutingStyle=SoapServiceRoutingStyle.SoapAction)]