我的 Delphi XE6 项目需要调用基于 SOAP 的 Web 服务。不幸的是,在 IIS 下部署我的项目时,从 64 位 DLL 中执行此类 Web 服务调用可能会出现问题。例如,参见以下公共 Web 服务:
当我将项目作为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
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