【发布时间】:2019-03-21 18:01:12
【问题描述】:
我正在使用带有 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 库上释放的东西吗?
【问题讨论】:
-
附带说明,您不应使用
TIdHTTP.Request.CustomHeaders属性手动发送Basic身份验证凭据。设置TIdHTTP.Request.BasicAuthentication=true并改用TIdHTTP.Request.Username和TIdHTTP.Request.Password属性。而UTF-8不是有效的ContentEncoding。并且在接收字符串响应时,您应该使用返回string的TIdHTTP.Get()的重载而不是填充TStream的重载,让TIdHTTP为您处理响应的字符集:DataString := FidHTTP.Get(url);
标签: post openssl delphi-7 indy10