用Delphi7 调用.NET 2.0的WebService 所要注意的问题(Document格式和UTF8编码)

时间:2021-12-24 06:50:01

Delphi7 调用VS.NET 2005开发的基于.NET 2.0的WebService时发生了错误。查阅资料  发现原来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), ‘‘, ‘utf-8‘);
  InvRegistry.RegisterInvokableClass(ServiceSoapImpl);
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap), ‘‘);
  InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);//指明Delphi采用Document编码
end. 


如果需要在WebService中传送汉字的参数,则建议在Service.pas中再添加一行代码

function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;
const
  defWSDL = ‘?wsdl‘;
  defURL  = ‘‘;
  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.

用Delphi7 调用.NET 2.0的WebService 所要注意的问题(Document格式和UTF8编码)