Dan*_*inu 4 .net c# http dotnet-httpclient
我正在使用.NET HttpClient向我的服务器发送请求.我已将HttpClient.Timeout属性设置为10秒,因此A task was cancelled每当服务器无法在不到10秒的时间内处理我的请求时,我就会收到异常.好到这里.
但是,如果关闭服务器,则需要HttpClient大约20秒才能返回正确的异常,例如图片中的异常.
我想看到这个异常超过10秒才能区分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)
您无法使用超时来处理此问题,如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)
| 归档时间: |
|
| 查看次数: |
2418 次 |
| 最近记录: |