42 votes

System.Net.WebClient excessivement lent

Lorsque vous utilisez le System.Net.WebClient.DownloadData() méthode J'obtiens un temps de réponse déraisonnablement lent.

Lorsque je récupère une URL à l'aide de la classe WebClient dans .NET, il faut environ 10 secondes pour obtenir une réponse, alors que la même page est récupérée par mon navigateur en moins d'une seconde. Et ce, avec des données d'une taille égale ou inférieure à 0,5 Ko.

La demande implique des paramètres POST/GET et un en-tête d'agent utilisateur si cela peut poser des problèmes.

Je n'ai pas (encore) essayé si d'autres façons de télécharger des données dans .NET me donnent les mêmes problèmes, mais je soupçonne que je pourrais obtenir des résultats similaires. (J'ai toujours eu l'impression que les requêtes web en .NET sont inhabituellement lentes...)

Quelle pourrait en être la cause ?

Edit :
J'ai essayé de faire exactement la même chose en utilisant System.Net.HttpWebRequest à la place, en utilisant la méthode suivante, et toutes les demandes se terminent en moins d'une seconde.

public static string DownloadText(string url)
        var request = (HttpWebRequest)WebRequest.Create(url);
        var response = (HttpWebResponse)request.GetResponse();

        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            return reader.ReadToEnd();
        }
}

Alors que cette (ancienne) méthode utilisant System.Net.WebClient Il faut 15 à 30 secondes pour que chaque demande soit traitée :

public static string DownloadText(string url)
{
       var client = new WebClient();
       byte[] data = client.DownloadData(url);
       return client.Encoding.GetString(data);
}

0 votes

86voto

Alex Burtsev Points 4251

J'ai eu ce problème avec WebRequest. Essayez de définir Proxy = null ;

    WebClient wc = new WebClient();
    wc.Proxy = null;

Par défaut, WebClient et WebRequest essaient de déterminer le proxy à utiliser à partir des paramètres d'IE, ce qui entraîne parfois un délai de 5 secondes avant l'envoi de la requête.

Ceci s'applique à toutes les classes qui emploient WebRequest, y compris les services de WCF avec la liaison de HTTP. En général, vous pouvez utiliser ce code statique au démarrage de l'application :

WebRequest.DefaultWebProxy = null;

2 votes

J'ai un énorme un gain de vitesse quand j'ai fait ça. Merci !

1 votes

Le deuxième a fait une énorme différence dans mon cas ! C'est définitivement la "fonctionnalité" de ralentissement de ces WebProxies.

0 votes

J'avais le même problème et cela améliore vraiment le temps de réponse !

2voto

Harvey Kwok Points 5508

Téléchargez Wireshark ici http://www.wireshark.org/

Capturez les paquets réseau et filtrez les paquets "http". Cela devrait vous donner la réponse immédiatement.

1 votes

Rien d'étrange n'apparaît sur wireshark, mais avec les traces, je peux voir que WebClient.DownloadData() est appelé, et que la requête GET n'apparaît sur wireshark qu'environ 10-30s plus tard (selon le temps de "gel"). Il semble que ce qui ralentit le processus n'est pas la requête elle-même, mais quelque chose qui est fait avant la requête GET.

1 votes

Il semble que votre client attendait le timeout de quelque chose. La plupart du temps, il attend le timeout du DNS ou le timeout de NetBIOS. Vous pouvez essayer de filtrer le paquet DNS et les paquets NetBIOS. Vous pouvez aussi essayer de filtrer par l'adresse IP source. Cela devrait vous indiquer quel est le dernier paquet que votre client a envoyé avant la requête GET. Peut-être que @Broken Pipe a raison. Il est peut-être en train d'attendre le proxy.

1voto

Marc Gravell Points 482669

Il n'y a rien d'intrinsèquement lent dans les requêtes web .NET ; ce code devrait être parfait. J'utilise régulièrement WebClient et cela fonctionne très rapidement.

Quelle est la taille de la charge utile dans chaque direction ? Question idiote peut-être, mais s'agit-il simplement de limitations de la bande passante ?

Le plus probable, c'est que votre site Web a été désactivé et que, lorsque vous cliquez sur l'URL, le site Web est lent à répondre. Ce n'est donc pas la faute du client. Il est également possible que le DNS soit lent pour une raison quelconque (auquel cas vous pourriez coder en dur l'IP dans votre fichier "hosts"), ou qu'un serveur proxy au milieu soit lent.

Si le site Web n'est pas le vôtre, il est également possible qu'ils détectent une utilisation atypique et injectent délibérément un délai pour gêner les racleurs.

Je prendrais Fiddler (un inspecteur web simple et gratuit) et regarderais les timings.

0voto

Uwe Keim Points 15221

Une autre alternative (également gratuite) à Wireshark est Moniteur réseau Microsoft .

0voto

TFD Points 10618

Quel navigateur utilisez-vous pour le test ?

Essayez d'utiliser l'installation par défaut d'IE. System.Net.WebClient utilise les paramètres locaux d'IE, le proxy, etc. Peut-être cela a-t-il été modifié ?

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