据我所知,没有办法知道这是不是特别发生了超时。我是不是找对了地方,还是错过了更大的东西?
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);
}
这将返回:
发生了一个或多个错误。
任务已取消。
发布于 2013-11-07 04:59:04
我正在重现同样的问题,这真的很烦人。我发现这些很有用:
HttpClient - dealing with aggregate exceptions
Bug in HttpClient.GetAsync should throw WebException, not 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!?)
}
}
发布于 2012-10-16 02:10:31
您需要等待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);
}
发布于 2015-08-26 23:09:54
我发现确定服务调用是否超时的最佳方法是使用取消令牌,而不是使用HttpClient的超时属性:
var cts = new CancellationTokenSource();
cts.CancelAfter(timeout);
然后在服务呼叫期间处理CancellationException ...
catch(TaskCanceledException)
{
if(cts.Token.IsCancellationRequested)
{
// Timed Out
}
else
{
// Cancelled for some other reason
}
}
当然,如果超时发生在服务端,应该能够由WebException处理。
https://stackoverflow.com/questions/10547895
复制相似问题