我正在使用带有Indy 10.6.2.5459的Delphi 7来不时向服务器发出POST请求:
sParams := '?ultimaAlteracao='+FormatDateTime('YYYY-MM-DD',now())+'T00:00:00.000';
FidHTTP := TIdHTTP.Create;
try
FidHTTP.Request.Clear;
FidHTTP.Request.Accept := 'application/json;charset=UTF-8';
FidHTTP.Request.CharSet := 'UTF-8';
FidHTTP.Response.ContentType := 'application/json;charset=UTF-8';
FidHTTP.Response.ContentEncoding := 'UTF-8';
FidHTTP.Request.CustomHeaders.AddValue('Authorization','Basic '+EncodeBase64('xx:xx@123456'));
JsonStream := TStringStream.Create('');
JsonStream.Position := 0;
try
FidHTTP.Get('https://'+server+'/LinxImportacaoArquivo/GetSelecaoDadosMDMNCM'+sParams, JsonStream);
DataString := JsonStream.DataString;
finally
FreeAndNil(JsonStream);
end;
finally
FreeAndNil(FidHTTP);
end;
一段时间后,它开始失败并返回:
创建SSL上下文时出错。错误:140A90F1:SSL例程:SSL_CTX_new:无法加载ssl2 md5例程
如果我重新启动应用程序,它会再次运行一段时间。我找到了一些有同样问题的人:here和here
根据我所学到的,可能是其他一些使用Indy提出干扰请求的过程,我引用
在openssl库中,某些类型的静态成员初始化似乎是一个问题。我有2个库,它们都使用openssl库,让我们称它们为A和B.当应用程序启动时,A和B都能够成功创建安全上下文。稍后,当库B尝试创建另一个安全上下文时,它会失败。库A和B都是我们应用程序的模块插件,因此它们都将加载,但如果不需要,它将被卸载。
实际上,我的应用程序有很多其他进程正在执行,通过indy10或WinInet发出http请求。
所以,我的问题是:是否有一些程序我可以调用Indy10来初始化在opensll库上释放它的东西?
我发现在IdSSLOpenSSL单元中有一个名为UnLoadOpenSSLLibrary的过程。如果我总是在我的代码之前调用该过程,则不会发生错误。