Delphi TIDHTTP:无法在非https URL上加载SSL库
我使用TIDHTTP从非https url下载zip文件,如下代码所示:Delphi TIDHTTP:无法在非https URL上加载SSL库,delphi,indy,indy10,Delphi,Indy,Indy10,我使用TIDHTTP从非https url下载zip文件,如下代码所示: IdHTTPProgress.DownloadFile('http://www.myurl.com/myfile.zip','c:\myfile.zip'); 尽管如此,我还是遇到了异常“无法加载SSL库”。例外情况会发生,但在那之后,无论如何都会进行下载 我怎样才能避免这个例外 谢谢发生异常的唯一方式是: 您已将TIdSSLIOHandlerSocketOpenSSL组件分配给TIdHTTP.IOHandler属性
IdHTTPProgress.DownloadFile('http://www.myurl.com/myfile.zip','c:\myfile.zip');
尽管如此,我还是遇到了异常“无法加载SSL库”。例外情况会发生,但在那之后,无论如何都会进行下载
我怎样才能避免这个例外
谢谢发生异常的唯一方式是:
- 您已将
组件分配给TIdSSLIOHandlerSocketOpenSSL
属性 它将尝试初始化OpenSSL,即使您发出HTTP请求,因为任何HTTP请求都可能重定向到HTTPS,因此Indy在建立TCP连接时准备OpenSSL,以防万一TIdHTTP.IOHandler
- 您尚未在应用程序中部署OpenSSL dll(
和libeay32.dll
,或目标平台的等效dll),或者-您部署了与您的Indy版本不兼容的错误版本的dll 如果要使用ssleay32.dll
,则需要正确的DLL。Indy目前最多支持OpenSSL 1.0.2,但不支持OpenSSL 1.1.0或更高版本(即现在)TIdSSLIOHandlerSocketOpenSSL
IdSSLOpenSSLHeaders
单元中调用Indy的WhichFailedToLoad()
函数,以确定故障是由于DLL未能加载到内存中,还是因为DLL缺少Indy所需的导出
IdSSLOpenSSL
单元中还有一个OpenSSLVersion()
函数,用于报告已将哪个版本的OpenSSL加载到内存中
在您的情况下,没有从HTTP重定向到HTTPS,但是错误仍然在内部发生,这
TIdHTTP
吞没了HTTPS,因为HTTPS没有被使用。您的代码在运行时不会看到异常。但是你的调试器会的。谢谢你的解释,Remy,但是在我的TIDTTP中IOHandler属性是空的。事实上,我没有部署OpenSSL DDL,因为我没有使用https,所以理论上我不需要它。只有在调试时才会发生异常。那么我应该忽略它吗?@delphirules异常是由TIdSSLIOHandlerSocketOpenSSL
引发的。如果将IOHandler
nil保留,则TIdHTTP
将根据第一个请求是HTTP还是HTTPS(但仅当IdSSLOpenSSL
在uses
子句中时)在内部创建一个默认值。设置后,IOHandler
不会自动更改。除非事先已设置了tidsliohandlersocketopenssl
,否则无法请求HTTP url并获取SSL加载错误。@delphirules,如果未设置tidsliohandlersocketopenssl
,并且发生了从HTTP重定向到HTTPS的情况,则会得到另一个异常(“IOHandler无效”)。但是是的,如果异常被TIdHTTP
吞并,并且没有到达您的代码,那么您可以忽略它。也可以选择告诉调试器忽略它。如果您根本不想使用HTTPS,则不应该在项目中引用IdSSLOpenSSL
单元。