【问题标题】:Connection timeout with TNetHTTPClient and Delphi 10.3与 TNetHTTPClient 和 Delphi 10.3 的连接超时
【发布时间】:2019-10-18 08:15:59
【问题描述】:

我尝试在 TNetHTTPClient 上为无响应的站点设置 6 秒的连接超时:

NetHTTPClient1.ConnectionTimeout := 6000;

但它不起作用,超时似乎总是相同的默认值(大约 1 百万)我是否缺少 ConnectionTimeout 或我的代码的某些内容?

编辑: 好的,我的错误,对于这个测试,我使用了一个(坏的)代理,它是没有响应的代理。因此,在代理不响应的情况下,ConnectionTimeout 似乎效率不高。我将发布有问题的模式代码示例。

编辑2:所以它似乎更像是“解决超时”而不是“连接超时”,代码: 首先经典连接一切正常(即使超时不是很准确)。

  TempTime := Now; //TempTime : TDateTime;
    try
      NetHTTPClient1.ConnectionTimeout := 2000;  // NetHTTPClient1 : TNetHTTPClient;
      NetHTTPClient1.Get('http://www.google.com:81');
    except
      on E: Exception do
        showmessage(E.ClassName + ' : ' + E.Message + ', Time : ' + IntToStr(trunc((Now-TempTime)*86400)));

结束;

现在超时不正常(代理错误):

  NetHTTPClient1.ProxySettings :=  TProxySettings.Create('157.230.8.180',8080);
    TempTime := Now;
    try
      NetHTTPClient1.ConnectionTimeout := 2000;
      NetHTTPClient1.Get('http://www.google.com:81');
    except
      on E: Exception do
        showmessage(E.ClassName + ' : ' + E.Message + ', Time : ' + IntToStr(trunc((Now-TempTime)*86400)));
    end;

【问题讨论】:

  • 显示重现问题的完整代码。
  • 你好大卫我编辑了我的帖子,我将把代码和例子放在一起。

标签: delphi delphi-10.3-rio


【解决方案1】:

您尚未为示例代码提供目标平台。根据documentation ConnectionTimeout 属性在OS XiOS 下不受支持。在这些平台下设置ConnectionTimeout 无效。

除此之外,您可能会在成功连接到服务器后发生响应超时,但服务器未能在指定的时间间隔内处理请求。

不幸的是,通过Exception 类无法区分两者,因为你得到的只是一般的ENetHttpClientException。至少您可以看到错误消息中的差异 - sendingreceiving(见下文)。

要测试的示例代码(Windows 平台): 连接超时

NetHTTPClient1.ConnectionTimeout := 1000;
NetHTTPClient1.Get('http://www.google.com:81');
{ raises ENetHttpClientException with message 'Error sending data: (12002) The operation timed out'. }

响应超时

NetHTTPClient1.ResponseTimeout := 1000;
NetHTTPClient1.Get('https://httpstat.us/200?sleep=5000');
{ raises ENetHTTPClientException with message 'Error receiving data: (12002) The operation timed out'. }

timeouts supported by WinHTTP 有 4 种不同的类型:

  • 解决超时问题
  • 连接超时
  • 发送超时
  • 接收超时

TNetHttpClient 的当前 Windows 平台实现始终将解析超时设置为 0,将连接超时设置为 ConnectionTimeout,并将发送和接收超时设置为 ResponseTimeout

【讨论】:

  • 感谢您提供完整且记录在案的答案。我的目标是 Windows。
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2015-05-23
相关资源
最近更新 更多