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.

  1. Créer un Projet Console en VS 2012.

  2. Veuillez copier et coller mon code Principal.

  3. 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?
InformationsquelleAutor Michael Sync | 2013-10-01