1

我尝试在 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;
4

1 回答 1

5

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

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

不幸的是,不可能按Exception类区分两者,因为你得到的只是 general ENetHttpClientException。至少您可以看到错误消息中的差异 - sendingvs receiving(见下文)。

测试示例代码(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'. }

WinHTTP 支持4 种不同类型的超时:

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

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

于 2019-06-02T18:29:01.297 回答