HttpClient - 如何判断服务器是否更快停机?

Dan*_*inu 4 .net c# http dotnet-httpclient

我正在使用.NET HttpClient向我的服务器发送请求.我已将HttpClient.Timeout属性设置为10秒,因此A task was cancelled每当服务器无法在不到10秒的时间内处理我的请求时,我就会收到异常.好到这里.

但是,如果关闭服务器,则需要HttpClient大约20秒才能返回正确的异常,例如图片中的异常.在此输入图像描述

我想看到这个异常超过1​​0秒才能区分Server Down和Operation花了太长时间的情况.我在msdn文档中找不到任何相关内容.是否有可以设置的超时HttpClient

这是我如何构建的 HttpClient

 var webRequestHandler = new WebRequestHandler
        {
            UseProxy = false,
            Proxy = null,
            AllowPipelining = false,
            ContinueTimeout = TimeSpan.Zero,
            UseCookies = false,
            AllowAutoRedirect = false,
        };
 var httpClient = new HttpClient(webRequestHandler);
 httpClient.Timeout = timeout;

  httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/json");
  httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgent);
  httpClient.DefaultRequestHeaders.ExpectContinue = false;
Run Code Online (Sandbox Code Playgroud)

vto*_*ola 11

这个答案只是扩展了@ brz的例子.

你可以使用这种不阻塞线程的方法(Task.Wait 阻塞线程)

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;
Run Code Online (Sandbox Code Playgroud)


brz*_*brz 4

您无法使用超时来处理此问题,如msdn中所述:

域名系统 (DNS) 查询最多可能需要 15 秒才能返回或超时。如果您的请求包含需要解析的主机名,并且您将 Timeout 设置为小于 15 秒的值,则可能需要 15 秒或更长时间才会引发 WebException 以指示您的请求超时。

但是,另一种方法是将您的请求包装在另一个任务中并从那里处理超时:

var task = Task.Run(() => { 
                var req = new HttpClient().GetAsync("http://www.google.com");
                if (!req.Wait(10000))//wait for 10 seconds
                    throw new TaskCanceledException(req);
            });
task.Wait();
Run Code Online (Sandbox Code Playgroud)