用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.
posted @   sonicit  阅读(930)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示