从64位Delphi DLL调用SOAP Web服务

时间:2015-01-21 12:17:59

标签: web-services delphi 64-bit isapi

我的Delphi XE6项目需要调用基于SOAP的Web服务。不幸的是,似乎在IIS下从64位DLL执行此类Web服务调用时可能会出现问题,这就是我的项目的部署方式。

请参阅以下公共网络服务:

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

在创建测试ISAPI webserver项目并导入上面的WSDL之后,我尝试使用以下代码进行Web服务调用:

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

1 个答案:

答案 0 :(得分: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的这种用例,对于这样一个昂贵的工具而言,这太麻烦了。