首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何判断HttpClient何时超时?

如何判断HttpClient何时超时?
EN

Stack Overflow用户
提问于 2012-05-11 16:22:47
回答 7查看 152.1K关注 0票数 169

据我所知,没有办法知道这是不是特别发生了超时。我是不是找对了地方,还是错过了更大的东西?

代码语言:javascript
复制
string baseAddress = "http://localhost:8080/";
var client = new HttpClient() 
{ 
    BaseAddress = new Uri(baseAddress), 
    Timeout = TimeSpan.FromMilliseconds(1) 
};
try
{
    var s = client.GetAsync("").Result;
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
    Console.WriteLine(e.InnerException.Message);
}

这将返回:

发生了一个或多个错误。

任务已取消。

EN

回答 7

Stack Overflow用户

发布于 2013-11-07 04:59:04

我正在重现同样的问题,这真的很烦人。我发现这些很有用:

HttpClient - dealing with aggregate exceptions

Bug in HttpClient.GetAsync should throw WebException, not TaskCanceledException

一些代码,以防链接无处可用:

代码语言:javascript
复制
var c = new HttpClient();
c.Timeout = TimeSpan.FromMilliseconds(10);
var cts = new CancellationTokenSource();
try
{
    var x = await c.GetAsync("http://linqpad.net", cts.Token);  
}
catch(WebException ex)
{
    // handle web exception
}
catch(TaskCanceledException ex)
{
    if(ex.CancellationToken == cts.Token)
    {
        // a real cancellation, triggered by the caller
    }
    else
    {
        // a web request timeout (possibly other things!?)
    }
}
票数 72
EN

Stack Overflow用户

发布于 2012-10-16 02:10:31

您需要等待GetAsync方法。如果超时,它将抛出一个TaskCanceledException。此外,GetStringAsyncGetStreamAsync在内部处理超时,因此它们永远不会抛出。

代码语言:javascript
复制
string baseAddress = "http://localhost:8080/";
var client = new HttpClient() 
{ 
    BaseAddress = new Uri(baseAddress), 
    Timeout = TimeSpan.FromMilliseconds(1) 
};
try
{
    var s = await client.GetAsync();
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
    Console.WriteLine(e.InnerException.Message);
}
票数 64
EN

Stack Overflow用户

发布于 2015-08-26 23:09:54

我发现确定服务调用是否超时的最佳方法是使用取消令牌,而不是使用HttpClient的超时属性:

代码语言:javascript
复制
var cts = new CancellationTokenSource();
cts.CancelAfter(timeout);

然后在服务呼叫期间处理CancellationException ...

代码语言:javascript
复制
catch(TaskCanceledException)
{
    if(cts.Token.IsCancellationRequested)
    {
        // Timed Out
    }
    else
    {
        // Cancelled for some other reason
    }
}

当然,如果超时发生在服务端,应该能够由WebException处理。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10547895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档