WebClient est très lent

J’ai un problème avec Webclient.

C’est très lent. Il faut environ 3-5 secondes pour télécharger une chaîne à partir d’un site Web. Je n’ai aucun problème de réseau.

Ceci est mon client Web modifié.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; namespace StatusChecker { class WebClientEx: WebClient { public CookieContainer CookieContainer { get; private set; } public WebClientEx() { CookieContainer = new CookieContainer(); ServicePointManager.Expect100Continue = false; Encoding = System.Text.Encoding.UTF8; WebRequest.DefaultWebProxy = null; Proxy = null; } public void ClearCookies() { CookieContainer = new CookieContainer(); } protected override WebRequest GetWebRequest(Uri address) { var request = base.GetWebRequest(address); if (request is HttpWebRequest) { (request as HttpWebRequest).CookieContainer = CookieContainer; } return request; } } } 

MISE À JOUR: Dans Wireshark, j’ai constaté que le simple DownladSsortingng envoie et reçoit quelques milliers de paquets.

Il peut y avoir deux problèmes ici (que j’ai également remarqués dans mes propres programmes):

  • La première demande prend un temps anormalement long : Cela se produit car WebRequest détecte et charge par défaut les parameters de proxy lors du premier démarrage, ce qui peut prendre un certain temps. Pour arrêter cela, définissez simplement la propriété proxy ( WebRequest.Proxy ) sur null et elle contournera le contrôle (à condition que vous puissiez accéder directement à Internet).
  • Vous ne pouvez pas télécharger plus de 2 éléments à la fois : par défaut, vous ne pouvez ouvrir que 2 connexions HTTP simultanées. Pour changer cela, définissez ServicePointManager.DefaultConnectionLimit sur quelque chose de plus grand. Je règle généralement cela sur int.MaxValue (assurez-vous simplement de ne pas spammer l’hôte avec 1 000 000 de connexions).

Cela aidera peut-être quelqu’un. Certains services Web prennent en charge la compression (gzip ou autre). Vous pouvez donc append un en-tête Accept-Encoding pour vos demandes, puis activer la décompression automatique pour l’instance du client Web. Chrome fonctionne de cette façon.

Il existe quelques options s’il est lié aux parameters de proxy initiaux vérifiés:

  1. Désactiver les parameters de détection automatique du proxy dans Internet Explorer
  2. Définissez le proxy sur null:

    WebClient.Proxy = null

  3. Au démarrage de l’application, définissez le proxy Web par défaut sur null:

    WebRequest.DefaultWebProxy = null;

Dans l’ancien code .NET au lieu de définir la valeur null, vous écriviez ceci (mais la valeur null est désormais préférée):

 webclient.Proxy = GlobalProxySelection.GetEmptyWebProxy();