如何知道HttpClient何时超时?

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

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

这返回:

发生一个或多个错误。

任务被取消了。

您需要等待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); } 

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

HttpClient – 处理聚合exception

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

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

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

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

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

当然如果超时发生在事物的服务端,那应该可以通过WebException来处理。

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

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

然后您可以访问Status属性,请参阅WebExceptionStatus