web-dev-qa-db-fra.com

System.Net.WebClient déraisonnablement lent

Lorsque j'utilise la méthode System.Net.WebClient.DownloadData () , le temps de réponse est excessivement long.

Lors de l'extraction d'une URL à l'aide de la classe WebClient dans .NET, il faut environ 10 secondes avant que je reçoive une réponse, tandis que la même page est extraite par mon navigateur en moins d'une seconde. de plus petite taille.

La demande implique des paramètres POST/GET et un en-tête d’agent d’utilisateur, si cela pouvait poser problème.

Je n'ai pas (encore) essayé si d'autres méthodes pour télécharger des données dans .NET me causaient les mêmes problèmes, mais je soupçonne que mes résultats pourraient être similaires. (J'ai toujours eu le sentiment que les requêtes Web dans .NET étaient exceptionnellement lentes ...)

Quelle pourrait en être la cause?

Modifier:  
J'ai essayé de faire exactement ce qui est utilisé en utilisant System.Net.HttpWebRequest, 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();
        }
}


Bien que cette méthode (ancienne) utilisant System.Net.WebClient prenne 15-30 secondes pour que chaque requête se termine:

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

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, WebRequest essaie de déterminer le proxy à utiliser à partir des paramètres IE. Il en résulte parfois un délai de 5 secondes environ avant l'envoi de la demande.

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

WebRequest.DefaultWebProxy = null;
77
Alex Burtsev

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

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

2
Harvey Kwok

Une autre alternative (également gratuite) à Wireshark est Microsoft Network Monitor .

0
Uwe Keim

WebClient peut être lent sur certains postes de travail lorsque l'option Paramètres proxy automatiques est cochée dans les paramètres IE (onglet Connexions - Paramètres réseau).

0
Richard

Quel navigateur utilisez-vous pour tester?

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

0
TFD

Une autre cause de téléchargements WebClient extrêmement lents est le média de destination sur lequel vous téléchargez. Si c'est un périphérique lent comme une clé USB, cela peut avoir un impact considérable sur la vitesse de téléchargement. Sur mon disque dur, je peux télécharger à 6 Mo/s, sur ma clé USB, seulement 700 Ko/s, même si je peux copier des fichiers sur cette clé USB à 5 Mo/s à partir d'un autre lecteur. wget montre le même comportement. Ceci est également rapporté ici:

https://superuser.com/questions/413750/why-is-downloading-over-usb-so-slow

Donc, si tel est votre scénario, une autre solution consiste à télécharger d'abord sur le disque dur, puis à copier les fichiers sur le support lent une fois le téléchargement terminé.

0
Mr. Bungle

Il n’existe pas de lenteur inhérente aux requêtes Web .NET; ce code devrait être bon. 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 bande passante?

OMI, la chose la plus probable est que votre site Web s'est effondré et que, lorsque vous cliquez sur l'URL, le site Web tarde à répondre. Ce n'est alors pas la faute du client. Il est également possible que le DNS soit lent pour une raison quelconque (dans ce cas, vous pouvez coder en dur l'adresse IP dans votre fichier "hôtes"), ou qu'un serveur proxy situé au milieu est lent.

Si le site Web ne vous appartient pas, il est également possible qu'ils détectent un usage atypique et qu'ils injectent délibérément un délai afin de gêner les grattoirs.

Je prendrais Fiddler (un inspecteur Web simple et gratuit) et regarderais les horaires.

0
Marc Gravell