从64位Delphi DLL调用SOAP Web服务

3
我的 Delphi XE6 项目需要调用基于 SOAP 的 Web 服务。不幸的是,在 IIS 下部署我的项目时,从 64 位 DLL 中执行此类 Web 服务调用可能会出现问题。例如,参见以下公共 Web 服务:

http://www.webservicex.net/geoipservice.asmx?WSDL

在创建了一个测试ISAPI Web服务器项目并导入上述WSDL后,我尝试使用以下代码进行WebService调用:
uses activeX, geoipservice;

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  CountryName : string;
  I : GeoIPServiceSoap;
  G : GeoIP2;
begin
  CoInitialize(nil);
  try
    CountryName := 'unassigned';
    I := GetGeoIPServiceSoap();
    if assigned(I) then begin
      G := I.GetGeoIP('...insert IP address here...');
      if assigned(G) then begin
        countryname := G.CountryName;
      end;
    end;
    Response.Content :=
      '<html>' +
      '<head><title>Web Service Test</title></head>' +
      '<body>Country: ' + CountryName + '</body>' +
      '</html>';
  except
    on E : exception do begin
      Response.Content :=
        '<html>' +
        '<head><title>Web Service Test</title></head>' +
        '<body>Exception: ' + E.ClassName() + ' ' + E.Message + '</body>' +
        '</html>';
    end;
  end;
  CoUninitialize();
end;

当我将项目作为32位ISAPI DLL运行时,在浏览器中查看网站会显示预期的国家名称。但是,当我将项目作为64位ISAPI DLL运行时,在浏览器中查看网站会显示以下错误消息(Zugriffsverletzung = 访问冲突):
异常:EAccessViolation Zugriffsverletzung bei Adresse 000000C700492460. Schreiben von Adresse 000000C700492460
这似乎与以下问题非常相似: Delphi XE2 64 bit ISAPI Access Violation 然而,那里的问题涉及到Delphi XE2,并且声明升级到Delphi XE4可以解决该问题。我已经在Delphi XE4和XE6中进行了测试,两者都存在该问题。
有其他人遇到过这个问题或者有解决方法吗?
设置:Delphi XE6,Win8.1,IIS 8.5

您在64位控制台应用程序中调用Web服务时是否遇到了问题? - whosrdaddy
谢谢回复。我刚刚尝试在Delphi XE6中创建一个控制台Web服务器应用程序,粘贴了上面的代码并将项目编译为64位EXE。查看网站时显示了国家名称(没有访问冲突)。 - Tim
我刚刚尝试创建了一个DLL项目(不是Web服务器),从中导出了一个执行上述Web服务调用的函数。当我从64位EXE调用此函数时,返回国家名称且没有发生访问冲突。因此,问题可能与Delphi的ISAPI实现有关,而不是一般的Delphi 64位DLL... - Tim
所以我尝试了一个显而易见的解决方案,即在非-ISAPI 64位Delphi DLL中执行webservice调用,然后从我的ISAPI 64位Delphi DLL中调用该DLL。然而,当我这样做时,访问冲突确实发生了。因此,问题似乎与在IIS上下文中运行的64位DLL中执行webservice调用有关--也许是Delphi的webservice调用代码正在执行一些IIS不允许的操作? - Tim
1个回答

0

我认为问题与wininet有关。Delphi使用Wininet(通过HTTPRIO)连接到SOAP服务器(请参见Soap.SOAPHTTPTrans.pas)。但是微软表示,在服务中(例如IIS)使用Wininet不受支持,这就是为什么它在控制台应用程序上运行的原因。服务应该使用WinHTTP。 https://support.microsoft.com/en-us/help/238425/info-wininet-not-supported-for-use-in-services

我曾经遇到过同样的问题,并尝试将Wininet调用转换为WinHTTP,但最终我放弃了Delphi,因为对于这种用例来说,这个工具太麻烦了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接