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