使用TNetHTTPClient和Delphi 10.3的连接超时

时间:2019-06-02 14:49:56

标签: delphi delphi-10.3-rio

我尝试使用以下命令在TNetHTTPClient上为无响应的站点设置6 s的连接超时:

NetHTTPClient1.ConnectionTimeout := 6000;

但是它不起作用,超时似乎始终是默认的默认值(大约100万),我是否在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)));

end;

现在超时(代理错误):

  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;

1 个答案:

答案 0 :(得分:4)

您尚未为示例代码提供目标平台。根据{{​​3}} ConnectionTimeoutOS 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'. }

documentation有4种不同的类型:

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

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