Por lo que puedo decir, no hay forma de saber que se haya producido un tiempo de espera específico. ¿No estoy buscando en el lugar correcto o me estoy perdiendo algo más grande?
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);
}
Esto devuelve:
Uno o más errores ocurrieron.
Se canceló una tarea.
c#
timeout
dotnet-httpclient
Benjol
fuente
fuente

Respuestas:
Necesitas esperar el
GetAsyncmétodo. Luego lanzará unTaskCanceledExceptionsi ha expirado. Además,GetStringAsyncyGetStreamAsyncmanejan internamente el tiempo de espera, por lo que NUNCA tirarán.fuente
GetStreamAsyncarrojé unoTaskCanceledExceptionpara mí.TaskCanceledExceptiones causado por el tiempo de espera HTTP y no, por ejemplo, la cancelación directa u otra razón?TaskCanceledException.CancellationToken.IsCancellationRequested. Si es falso, puede estar razonablemente seguro de que fue un tiempo de espera.IsCancellationRequestedconfigurar el token de la excepción de cancelación directa como pensaba anteriormente: stackoverflow.com/q/29319086/62600Estoy reproduciendo el mismo problema y es realmente molesto. He encontrado estos útiles:
HttpClient: manejo de excepciones agregadas
Error en HttpClient.GetAsync debería lanzar WebException, no TaskCanceledException
Algún código en caso de que los enlaces no vayan a ninguna parte:
fuente
WebExceptionpuede ser atrapado. Quizás esto ayude.default(CancellationToken)antes de compararloex.CancellationToken.Descubrí que la mejor manera de determinar si la llamada de servicio ha excedido el tiempo de espera es usar un token de cancelación y no la propiedad de tiempo de espera de HttpClient:
Y luego maneje la excepción de cancelación durante la llamada de servicio ...
Por supuesto, si el tiempo de espera se produce en el lado del servicio de las cosas, eso debería ser manejado por una WebException.
fuente
cts.Token.IsCancellationRequestedestrueque debe significar que un tiempo de espera ha ocurrido?De http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout.aspx
Luego obtiene acceso a la
Statuspropiedad, consulte WebExceptionStatusfuente
AggregateExceptioncon unTaskCancelledExceptionadentro. Debo estar haciendo algo mal ...catch(WebException e)?AggregateExceptionno se maneja. Si crea un proyecto de consola VS, agregue una referenciaSystem.Net.Httpy suelte el códigomain, puede verlo usted mismo (si lo desea).TaskCanceledException. Esto parece ser lanzado por el manejo interno del tiempo de espera del TPL, a un nivel más alto que elHttpWebClient. No parece haber una buena manera de distinguir entre una cancelación de tiempo de espera y una cancelación de usuario. El resultado de esto es que es posible que no obtenga unWebExceptiondentro de suAggregateException.Básicamente, debe capturar
OperationCanceledExceptiony verificar el estado del token de cancelación que se pasó aSendAsync(oGetAsync, o cualquierHttpClientmétodo que esté utilizando):IsCancellationRequestedes cierto), significa que la solicitud realmente se cancelóPor supuesto, esto no es muy conveniente ... sería mejor recibir un
TimeoutExceptionen caso de tiempo de espera. Propongo una solución aquí basada en un controlador de mensajes HTTP personalizado: mejor manejo del tiempo de espera con HttpClientfuente
HttpClient.Timeoutinfinito?es lo que suelo hacer, parece funcionar bastante bien para mí, es especialmente bueno cuando uso proxies.
fuente