在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
用VS.NET 2003开发的基于.NET 1.1的WebService,可以用Delphi7正确调用。但同样的方法调用VS.NET 2005开发的基于.NET 2.0的WebService时却发生了错误。查阅资料 http://www.community.borland.com/article/borcon/files/4132/paper/4132.html 发现原来Delphi7客户端虽然支持WebService的RPC|Encoded 和 Document|Literal编码,但 默认的是使用RPC。而.NET 2.0下的WebService却是默认采用Documnet|Literal编码的。因此我们需要显示地声明让Delphi客户端采用Documnet|Literal编码就可以了。在Delphi的WSDL Importer产生了WebService的接口文件中加入如下行:
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);//指明Delphi采用Document编码 end. Delphi端还是按照以前的代码书写即可: uses
Service;
......
var
a:ServiceSoap; begin a := GetServiceSoap; Caption := a.HelloWorld; end; 如果需要在WebService中传送汉字的参数,则建议在Service.pas中再添加一行代码
function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;
const defWSDL = 'http://localhost/myservice/service.asmx?wsdl'; defURL = 'http://localhost/myservice/service.asmx'; defSvc = 'Service'; defPrt = 'ServiceSoap'; var RIO: THTTPRIO; begin Result := nil; if (Addr = '') then begin if UseWSDL then Addr := defWSDL else Addr := defURL; end; if HTTPRIO = nil then RIO := THTTPRIO.Create(nil) else RIO := HTTPRIO; RIO.HTTPWebNode.UseUTF8InHeader := 'UTF-8'; //添加该行,指定采用UTF-8代码传输 try Result := (RIO as ServiceSoap); if UseWSDL then begin RIO.WSDLLocation := Addr; RIO.Service := defSvc; RIO.Port := defPrt; end else RIO.URL := Addr; finally if (Result = nil) and (HTTPRIO = nil) then RIO.Free; end; end;
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论