据我所知,有没有办法知道它的具体发生了超时。 我不能找对了地方,还是我失去了一些东西变大?
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的-处理例外汇总
错误在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秒返回或超时。 如果您的请求包含要求分辨率的主机名和你设置的超时值小于15秒, 被抛出引发WebException前,表示对您的请求超时 ,可能需要15秒以上。
然后,您可以访问的Status
属性,看WebExceptionStatus
基本上,你需要赶上OperationCanceledException
并检查传递给取消标记的状态SendAsync
(或GetAsync
,或任何HttpClient
方法,你正在使用):
- 如果它被取消(
IsCancellationRequested
是真实的),这意味着该请求真的被取消 - 如果不是,则意味着超时请求
当然,这是不是很方便?倒不如接收TimeoutException
在超时的情况。 我在这里提出一个解决方案基于自定义HTTP消息处理程序: 用更好的HttpClient超时处理
_httpClient = new HttpClient(handler) {Timeout = TimeSpan.FromSeconds(5)};
是我平时做,似乎是使用代理何时工作就不错对我来说,它的特别好。