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
GetAsync
método. Luego lanzará unTaskCanceledException
si ha expirado. Además,GetStringAsync
yGetStreamAsync
manejan internamente el tiempo de espera, por lo que NUNCA tirarán.fuente
GetStreamAsync
arrojé unoTaskCanceledException
para mí.TaskCanceledException
es 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.IsCancellationRequested
configurar 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
WebException
puede 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.IsCancellationRequested
estrue
que 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
Status
propiedad, consulte WebExceptionStatusfuente
AggregateException
con unTaskCancelledException
adentro. Debo estar haciendo algo mal ...catch(WebException e)
?AggregateException
no se maneja. Si crea un proyecto de consola VS, agregue una referenciaSystem.Net.Http
y 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 unWebException
dentro de suAggregateException
.Básicamente, debe capturar
OperationCanceledException
y verificar el estado del token de cancelación que se pasó aSendAsync
(oGetAsync
, o cualquierHttpClient
método que esté utilizando):IsCancellationRequested
es cierto), significa que la solicitud realmente se cancelóPor supuesto, esto no es muy conveniente ... sería mejor recibir un
TimeoutException
en 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.Timeout
infinito?es lo que suelo hacer, parece funcionar bastante bien para mí, es especialmente bueno cuando uso proxies.
fuente