【发布时间】:2020-03-10 02:28:43
【问题描述】:
我正面临着 httpclient 和超时配置。在做了很多谷歌搜索后,我得出了以下结论:
- 只有当我连接到可用的主机/服务器时,Http 客户端超时才正常。
- 如果主机不可用或服务器关闭,HttpClient.Timeout 无关紧要,大约 80 秒后我会收到一个包含 SocketException(连接被拒绝)的 TaskCancelledException。
我知道 httpClient 超时仅在服务器收到请求后才起作用,因此,如果主机/服务器关闭,我会得到与套接字相关的很长时间的超时。
我需要为我的 httpClient getAsync、postAsync... 请求配置更“宽”的超时,并在指定的时间停止操作,无论服务器是否可用。
我无法弄清楚我可以做些什么来有效地控制时间,stackoverflow 线程 (link) 建议以这种方式执行任务调用方法:
var timeout = Task.Delay(10000); // 10 seconds timeout
var request = httpClient.GetAsync("http://www.google.com");
await Task.WhenAny(timeout, request); // wait for either timeout or the request
if (timeout.IsCompleted) // if the timeout ended first, then handle it
{
// handle timeout
}
// otherwise continue processing the request result
var response = await request;
虽然这可能有效,但我会丢失套接字异常并提供较差的控制。因为,简而言之,我想做的是找到一种方法来设置解决/连接到服务器的超时时间(大约 2 秒),以及在与服务器建立连接后等待响应的更高超时时间。
这对我来说很有意义,因为我的 Web 服务器是通过本地网络访问的,因此,2 秒足以得出“服务器不可用”的结论,但是一旦服务器开始处理响应,我需要更大的超时时间等待响应。
提前致谢。
【问题讨论】:
标签: c# timeout dotnet-httpclient