HttpClient - tâche a été annulée - Comment obtenir le message d'erreur exact?
J'ai le texte suivant du code de test. J'ai toujours de la "Tâche a été annulée" erreur après le bouclage 316934 ou 361992 fois.
Si je ne me trompe pas, il y a deux raisons possibles pour lesquelles la tâche a été annulé) HttpClient eu de délai d'attente ou b) de trop nombreuses tâches dans la file d'attente et quelques tâches eu le temps d'attente.
Je n'arrivais pas à trouver de la documentation à propos de la limitation dans les files d'attente des tâches. Et j'ai essayé de créer plus de 500K tâches et aucun délai d'attente. Je suppose que la raison "b" pourrait ne pas être de droite.
T1. Est-il une autre raison que j'ai raté?
T2. Si c'est parce que HttpClient délai d'attente, comment puis-je obtenir le message d'exception exact au lieu de "TaskCancellation" l'exception".
T3. Quel serait le meilleur moyen pour résoudre ce problème? Dois-je introduire la throttler?
Merci!
var _httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");
int[] intArray = Enumerable.Range(0, 600000).ToArray();
var results = intArray
.Select(async t => {
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "http://www.google.com")) {
log.Info(t);
try {
var response = await _httpClient.SendAsync(requestMessage);
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent;
}
catch (Exception ex) {
log.ErrorException(string.Format("SoeHtike {0}", Task.CurrentId), ex);
}
return null;
}
});
Task.WaitAll(results.ToArray());
Console.ReadLine();
Ici est l'étape qui consiste à reproduire le problème.
-
Créer un Projet Console en VS 2012.
-
Veuillez copier et coller mon code Principal.
-
Mettre le point d'arrêt sur cette ligne " du journal.ErrorException(chaîne de caractères.Format("SoeHtike
{0}",
De la tâche.CurrentId),
ex);"
Exécuter le programme en mode debug. Attendez quelques minutes. (peut-être 5 minutes? ) Je viens de tester mon code et j'ai eu l'exception après 3 minutes. Si vous avez fiddler, vous pouvez surveiller les demandes de sorte que vous savez le programme est toujours en cours d'exécution ou non.
Hésitez pas à laissez-moi savoir si vous ne pouvez pas reproduire le problème.
- Ce que vous faites est d'arriver à la page de 600.000 ses effectivement une Attaque DOS et vous ne devriez pas le faire.
- Salut, je comprends. Mais il ya quelques sites qui peuvent gérer d'énormes demandes. Et j'aimerais savoir pourquoi j'ai eu la "Tâche a été annulée" sans message d'erreur.
- et de plus, je ne pense pas que ce soit le site qui bloque ma demande
- peut-être qu'il est de force brute de son propre site web afin de renforcer la protection contre les attaques DOS?
Vous devez vous connecter pour publier un commentaire.
La valeur par défaut
HttpClient.Timeout
valeur est de 100 secondes (00:01:40). Si vous faites un timestamp dans votrecatch
bloc, vous remarquerez que les tâches de commencer à se annulé exactement à ce moment. Apparemment, il y a un nombre limité de requêtes HTTP, vous pouvez le faire par seconde, d'autres sont en attente. File d'attente des requêtes annulée le délai d'attente. De tous les 600k de tâches personnellement, je suis seulement 2500 réussi, d'autres ont été annulés.Je trouve aussi qu'il est peu probable que vous serez en mesure d'exécuter l'ensemble de 600000 des tâches. De nombreux pilotes de réseau, par l'intermédiaire de nombre élevé de demandes que pour un petit temps, et de réduire ce nombre à une valeur très faible après un certain temps. Ma carte réseau m'a permis d'envoyer seulement 921 demandes dans un délai de 36 secondes et a chuté que de la vitesse à une seule demande par seconde. À cette vitesse, il faudra une semaine pour accomplir toutes les tâches.
Si vous êtes en mesure de contourner cette limitation, assurez-vous de générer le code pour la plate-forme 64 bits que l'application est très avide de mémoire.
Ne jetez pas à l'instance de HttpClient que vous utilisez. Bizarre, mais fixe pour moi ce problème.
HttpClient
. Si vous êtes intéressé, vous pouvez également consulter CIL de la classe pour voir pourquoi il ne devrait pas être éliminés fréquemment pour vous-même.HttpClient
qui sont à 100% ne doit pas être utilisé de cette façon).HttpClient
une fois, mais je suis en train de travailler sur une application web. Quelle serait la meilleure façon d'instancier laHttpClient
alors? Si j'ai juste un client qui est utilisé par le code qui gère tous les incomming demande, comment cette échelle?{Method}Async
famille de méthodes (par exempleGetAsync()
) et à la fin de l'aidePostAsync
directement, la seule méthode d'accepterHttpRequestMessage
où vous pouvez effectuer la personnalisation. Si ce n'est pas votre cas, alors réutiliser instance du singleton de HttpClientvoulais juste partager
J'ai eu un code similaire à l'essai de charge de nos serveurs ,et ses une forte probabilité que vos demandes sont à expiration.
Vous pouvez définir le délai d'attente pour votre demande http max et voir si ça change quelque chose pour vous.
J'ai essayé de frapper nos serveurs par la création de plusieurs fils. Et il a augmenté les coups, mais ils seraient tous finalement délai d'attente.Et aussi vous ne pouvez pas définir un délai d'attente lors de la frappe sur un autre thread.