您的位置:首页 > 编程语言 > Delphi

(转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题

2015-02-15 10:00 736 查看
摘要: Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题

(转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题

//add-------to support UTF-8


RIO.HTTPWebNode.UseUTF8InHeader :
= true; //添加该行,指定采用UTF-8代码传输


RIO.Converter.Encoding:='UTF-8';


RIO.Converter.Options:=RIO.Converter.Options +
[soUTF8InHeader,soUTF8EncodeXML];


//add-------END

今天测试.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)]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息