我面对的是whit-httpclient和超时配置。在谷歌上搜索了很多之后,我得出了以下结论:
- 只有当我连接到可用的主机/服务器时,Http客户端超时才可以
- 如果主机不可用或服务器关闭,请使用HttpClient。超时并不重要,大约80秒后,我收到一个TaskCancelledException包装SocketException(连接被拒绝(
我了解到httpClient超时只有在服务器收到请求后才能工作,因此,如果主机/服务器关闭,我会得到与套接字相关的长时间超时。
我需要为httpClient getAsync、postAsync配置一个更"宽"的超时。。。请求,并在指定的时间量停止操作,无论服务器是否可用。
我不知道我能做些什么来有效地控制时间,那个stackoverflow线程(链接(,建议用这种方式计算任务:
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秒(,以及在建立到服务器的连接后等待响应的更高超时时间。
这对我来说是有意义的,因为我的网络服务器是通过本地网络访问的,所以,2秒的时间足以得出"服务器不可用"的结论,但一旦服务器开始处理响应,我需要更大的等待响应的超时时间。
提前谢谢。
那个stackoverflow线程,建议任务计算方法
链接问题方法是正确的方法。
基本上,问题在于连接超时是由操作系统设置管理的,不能直接在代码中设置。
虽然这可能有效,但我将丢失套接字异常,并提供较差的控制
捕获和记录套接字异常(或任何其他异常(没有问题。只需为"主要"任务设置适当的任务取消:
// task is returned from async method performing payload, e.g. httpClient.GetAsync
task.ContinueWith(
t =>
{
var exception = t.Exception;
// do what you want here
},
TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously);
我正在考虑这个变通方法:
启动两个并行的http请求,其中一个是伪get请求(服务器directy响应正常(,我将用你在问题中看到的建议方法等待这项任务2秒。另一个要求是"真正的要求"。。。如果第一个请求没有在两秒内完成,我也会取消第二个请求,但如果第一个要求结束得很好,那么服务器工作正常,我依赖httpClient。第二个请求超时。
是的,这对服务器来说是一种开销,因为每个请求变成了两个请求,但我的服务器是本地网络,每分钟只处理1-2个请求的客户端不超过5-10个,所以,我会考虑这种方法。或者它可能糟糕到一个坏主意。。。你觉得怎么样?
由于GetAsync
返回Task
,因此可以使用Task。等待方法
例如:
var readTask = httpClient.GetAsync("http://www.google.com");
if (readTask.Wait(2 * 1000))
{
// Return Result if exec dosn't take more than 2 sec
// return await readTask;
return readTask.Result;
}
else
{
// Fail to complete exec in 2 sec
return string.Empty;
}