我怎样才能知道当HttpClient的超时?我怎样才能知道当HttpClient的超时?(How c

2019-05-14 00:57发布

据我所知,有没有办法知道它的具体发生了超时。 我不能找对了地方,还是我失去了一些东西变大?

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);
}

这将返回:

发生一个或多个错误。

任务被取消。

Answer 1:

你需要等待GetAsync方法。 然后,它会抛出一个TaskCanceledException它是否已超时。 此外, GetStringAsyncGetStreamAsync内部处理超时,所以他们不会抛出。

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);
}


Answer 2:

我复制了同样的问题,这真是烦人。 我发现这些有用:

HttpClient的-处理例外汇总

错误在HttpClient.GetAsync应该抛出引发WebException,不TaskCanceledException

某些代码的情况下,链接无处可去:

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!?)
    }
}


Answer 3:

我发现,最好的方式来确定服务呼叫已超时是使用取消标记,而不是HttpClient的的超时属性:

var cts = new CancellationTokenSource();
cts.CancelAfter(timeout);

然后在服务调用期间处理CancellationException ...

catch(TaskCanceledException)
{
    if(!cts.Token.IsCancellationRequested)
    {
        // Timed Out
    }
    else
    {
        // Cancelled for some other reason
    }
}

如果对事物的服务端发生超时当然,这应该能够引发WebException来处理。



Answer 4:

从http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout.aspx

域名系统(DNS)查询可能需要长达15秒返回或超时。 如果您的请求包含要求分辨率的主机名和你设置的超时值小于15秒, 被抛出引发WebException,表示对您的请求超时 ,可能需要15秒以上。

然后,您可以访问的Status属性,看WebExceptionStatus



Answer 5:

基本上,你需要赶上OperationCanceledException并检查传递给取消标记的状态SendAsync (或GetAsync ,或任何HttpClient方法,你正在使用):

  • 如果它被取消( IsCancellationRequested是真实的),这意味着该请求真的被取消
  • 如果不是,则意味着超时请求

当然,这是不是很方便?倒不如接收TimeoutException在超时的情况。 我在这里提出一个解决方案基于自定义HTTP消息处理程序: 用更好的HttpClient超时处理



Answer 6:

_httpClient = new HttpClient(handler) {Timeout = TimeSpan.FromSeconds(5)};

是我平时做,似乎是使用代理何时工作就不错对我来说,它的特别好。



文章来源: How can I tell when HttpClient has timed out?