我尝试使用以下命令在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;
答案 0 :(得分:4)
您尚未为示例代码提供目标平台。根据{{3}} ConnectionTimeout
,OS X
和iOS
不支持该属性。在这些平台下设置ConnectionTimeout
无效。
除此以外,您可能会获得成功连接到服务器后发生的响应超时,但是服务器无法在指定的时间间隔内处理请求。
不幸的是,无法通过Exception
类来区分两者,因为您得到的只是一般的ENetHttpClientException
。至少您可以看到错误消息中的区别-sending
与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'. }
documentation有4种不同的类型:
当前TNetHttpClient
的Windows平台实现始终将解析超时设置为0,将连接超时设置为ConnectionTimeout
,并将发送和接收超时都设置为ResponseTimeout
。