Tanto quanto posso dizer, não há como saber que ocorreu especificamente um tempo limite. Não estou procurando o lugar certo ou estou perdendo algo maior?
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);
}
Isso retorna:
Ocorreu um ou mais erros.
Uma tarefa foi cancelada.
c#
timeout
dotnet-httpclient
Benjol
fonte
fonte
Respostas:
Você precisa aguardar o
GetAsync
método. Em seguida, ele lançará umTaskCanceledException
se tiver atingido o tempo limite. Além disso,GetStringAsync
eGetStreamAsync
lida internamente com o tempo limite, para que NUNCA joguem.fonte
GetStreamAsync
joguei umTaskCanceledException
para mim.TaskCanceledException
é causado pelo tempo limite do HTTP e não, como cancelamento direto ou outro motivo?TaskCanceledException.CancellationToken.IsCancellationRequested
. Se falso, você pode estar razoavelmente certo de que foi um tempo limite.IsCancellationRequested
a configuração do token da exceção no cancelamento direto, como eu pensava anteriormente: stackoverflow.com/q/29319086/62600Estou reproduzindo o mesmo problema e é realmente irritante. Eu achei estes úteis:
HttpClient - lidando com exceções agregadas
O bug no HttpClient.GetAsync deve gerar WebException, não TaskCanceledException
Algum código no caso de os links não chegarem a lugar algum:
fonte
WebException
pode ser capturado. Talvez isso ajude.default(CancellationToken)
antes de comparar comex.CancellationToken
.Descobri que a melhor maneira de determinar se a chamada de serviço expirou é usar um token de cancelamento e não a propriedade timeout do HttpClient:
E então lide com o CancellationException durante a chamada de serviço ...
Obviamente, se o tempo limite ocorrer no lado do serviço, isso poderá ser tratado por uma WebException.
fonte
cts.Token.IsCancellationRequested
étrue
isso deve significar que um tempo limite ocorreu?Em http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout.aspx
Você obtém acesso à
Status
propriedade, consulte WebExceptionStatusfonte
AggregateException
com umTaskCancelledException
interior. Eu devo estar fazendo algo errado ...catch(WebException e)
?AggregateException
é não tratado. Se você criar um projeto de console do VS, adicionar uma referênciaSystem.Net.Http
e soltar o códigomain
, poderá ver por si mesmo (se desejar).TaskCanceledException
. Isso parece ser causado pelo processamento de tempo limite interno do TPL, em um nível mais alto que oHttpWebClient
. Não parece haver uma boa maneira de distinguir entre um cancelamento de tempo limite e um cancelamento de usuário. O resultado disso é que você pode não ter umWebException
interior dentro do seuAggregateException
.Basicamente, você precisa capturar
OperationCanceledException
e verificar o estado do token de cancelamento que foi passado paraSendAsync
(ouGetAsync
, ou qualquer outroHttpClient
método que esteja usando):IsCancellationRequested
é verdade), significa que a solicitação foi realmente canceladaObviamente, isso não é muito conveniente ... seria melhor receber um
TimeoutException
em caso de tempo limite. Eu proponho uma solução aqui com base em um manipulador de mensagens HTTP personalizado: Melhor controle de tempo limite com HttpClientfonte
HttpClient.Timeout
infinito?é o que eu costumo fazer, parece funcionar muito bem para mim, é especialmente bom ao usar proxies.
fonte