如何知道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
。 此外, GetStringAsync
和GetStreamAsync
内部处理超时,所以他们永远不会抛出。
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