Delphi 客户端连接到 HTTPS - TRestRequest.Execute 比 TIdHttp.Post 慢很多

问题描述 投票:0回答:1
  • 服务器:Delphi VCL 应用程序,使用 TIdHTTPWebBrokerBridge、TIdServerIOHandlerSSLOpenSSL 并分配 SSLOptions.CertFile/KeyFile/OnGetPassword。在 WebModule 中,绑定到 /some/path 的 WebActionItem.OnAction 从数据库返回少量字符。整个 OnAction 处理程序需要 cca 50 毫秒

  • 客户端:Delphi(测试)VCL 应用程序使用 TRestClient 和 TRestRequest(method=rmPost)访问 https://localhost:NNNN/some/path。第一个 TRequest.Execute 需要 2000 毫秒以上,后续的 TRequest.Execute 需要 cca 1100 毫秒 才能返回上述少量字符。

  • 客户端 2:Delphi(测试)VCL 应用程序,使用 TIdHttp 和 IOHandler= TIdSSLIOHandlerSocketOpenSSL 实例。请求的执行是一个简单的 TIdHttp.Post(https://localhost:NNNN/some/path ..) - 第一个请求的时间略低于 1000 毫秒,后续请求的时间为 cca 60 ms

服务器与两个客户端一样在 localHost 上交互运行。两个客户端都返回与预期相同的正确结果。服务器端计时不会从一个客户端更改到下一个客户端。

所以我的问题显然是 - 这怎么可能?我在 TRestRequest 使用中可能做错了什么?如果需要,我会提供更多详细信息,但对于初学者来说,我只想了解 Delphi TRestClient 是否有任何已知问题..

编辑:简单地重新阅读问题,我注意到 TIdHttp.Post 第一次计时和 TRestRequest.Execute 后续计时的相似性。难道 TRestRequest 会为每次调用重新创建 SSL IOHandler 并失去所有缓存对性能的好处吗?

EDIT2:TRESTRequest.Execute 最终出现在 System.Net.HttpClient.Win.TWinHTTPClient.DoExecuteRequest() 中,它一直在调用 winhttp.dll:WinHttpSendRequest(),所以这显然是一个外部问题(Windows Server 2019,WinHttp .dll 版本 10.0.17763.4492)..这里的文档以防有人知道是什么减慢了速度https://learn.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp- winhttps发送请求

这也令人担忧:https://microsoft.public.winhttp.narkive.com/x5OOQlt0/winhttp-15-second-delay-sending-my-data-caused-by-windowsupdate

rest delphi ssl indy delphi-11-alexandria
1个回答
0
投票

我的错。我假设问题出在客户端 - 事实上问题出在服务器端!

在服务器中,我有

    FServer: TIdHTTPWebBrokerBridge;
...
       
    FServer.DefaultPort := NNNN

  FServer.Bindings.Add.Port := NNNN

无论我是否使用 SSL (TIdServerIOHandlerSSLOpenSSL ),第二个子句 (FServer.Bindings.Add) 都会导致 TRESTRequest 客户端变慢。如果我删除 FServer.Bindings.Add,一切都会加快。由于我想支持在几个不同的端口上进行响应,我开始尝试各种变体,最终这有所帮助:

with  FServer.Bindings.Add do begin
  Port := NNNN; 
  IPVersion := Id_IPv6
end

默认为 IPVersion = Id_IPv4。

我无权查看调整后的设置,但已询问管理员 - 他说这个盒子只配置了 IPv4,没有 IPv6 ??????

无论如何,更改后,客户端上的 TRESTRequest 和 TIdHttp 在使用或不使用 SSL 的情况下都可以同样快速地工作。

为了安全起见,我现在添加了这样的服务器端代码:

with  FServer.Bindings.Add do begin
  Port := NNNN; 
  IPVersion := Id_IPv6
end;
with  FServer.Bindings.Add do begin
  Port := NNNN; 
  IPVersion := Id_IPv4
end

我正在使用 Delphi 11.3 附带的 Indy - 在 IDCompilerDefines.inc 中,这些是

...
{$DEFINE INDY100}
{$DEFINE 10_6_2}  //so developers can IFDEF for this specific version
...

因此,上述问题中描述的速度下降可能是在某些非常具体的情况下 WinHttp.dll 客户端和 Indy 10 服务器端交互的“功能”。

© www.soinside.com 2019 - 2024. All rights reserved.