192 votes

Comment puis-je savoir si HttpClient a dépassé le temps imparti ?

Pour autant que je sache, il n'y a aucun moyen de savoir que c'est spécifiquement un dépassement de délai qui s'est produit. Est-ce que je ne cherche pas au bon endroit, ou est-ce que je rate quelque chose de plus important ?

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);
}

Cela revient :

Une ou plusieurs erreurs se sont produites.

Une tâche a été annulée.

3 votes

0 votes

Un énorme upvote pour la question. Aussi... une idée de comment faire cela sur UWP ? Son Windows.Web.HTTP.HTTPClient n'a pas de membre timeout. De plus, la méthode GetAsync n'accepte pas le jeton d'annulation...

1 votes

6 ans plus tard, il ne semble toujours pas possible de savoir si un client a dépassé le temps imparti.

10voto

Stijn Points 6427

Desde http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout.aspx

Une requête du système de nom de domaine (DNS) peut prendre jusqu'à 15 secondes avant de revenir ou de s'interrompre. Si votre requête contient un nom d'hôte qui doit être résolu et que vous avez défini le délai d'attente sur une valeur inférieure à 15 secondes, il se peut que 15 secondes ou plus s'écoulent avant que la requête soit renvoyée. une exception WebException est levée pour indiquer un dépassement de délai sur votre requête. .

Vous aurez alors accès à la Status la propriété, voir WebExceptionStatus

3 votes

Hm, je récupère un AggregateException avec un TaskCancelledException à l'intérieur. Je dois faire quelque chose de mal...

0 votes

Utilisez-vous catch(WebException e) ?

0 votes

Non, et si j'essaie, le AggregateException n'est pas gérée. Si vous créez un projet VS console, ajoutez une référence à System.Net.Http et déposez le code dans main vous pouvez le constater par vous-même (si vous le souhaitez).

-4voto

Syv Development Points 65
_httpClient = new HttpClient(handler) {Timeout = TimeSpan.FromSeconds(5)};

c'est ce que je fais d'habitude, cela semble fonctionner assez bien pour moi, c'est particulièrement bien quand on utilise des proxies.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X