转: 用Delphi7 调用.NET 2.0的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. 

如果需要在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 : = True ;   // 添加该行,指定采用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;

需要说明的是使用Delphi2006则不需要上述的改变即可以正确调用VS.NET 2005书写的WebService.

(0)

相关推荐