WebClient очень медленный - PullRequest
       6

WebClient очень медленный

11 голосов
/ 09 августа 2011

У меня проблема с Webclient.

Это очень медленно. Загрузка строки с одного сайта занимает около 3-5 секунд. У меня нет проблем с сетью.

Это мой модифицированный веб-клиент.

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;
        }
    }
}

UPDATE: В Wireshark я видел, что одна DownladString отправляет и получает несколько тысяч пакетов.

Ответы [ 3 ]

29 голосов
/ 09 августа 2011

Здесь могут быть две проблемы (которые я также заметил ранее в моих собственных программах):

  • Первый запрос занимает слишком много времени : это происходит потому, что WebRequest по умолчанию обнаруживает и загружает настройки прокси-сервера при первом запуске, что может занять довольно много времени. Чтобы остановить это, просто установите для свойства proxy (WebRequest.Proxy) значение null, и оно будет обходить проверку (при условии, что вы можете получить прямой доступ к Интернету)
  • Вы не можете загружать более 2 элементов одновременно : по умолчанию у вас может быть открыто только 2 одновременных HTTP-соединения. Чтобы изменить это, установите ServicePointManager.DefaultConnectionLimit на что-то большее. Я обычно устанавливаю это на int.MaxValue (просто убедитесь, что вы не спамите хост с 1 000 000 подключений).
0 голосов
/ 17 октября 2017

Существует несколько параметров, если они связаны с проверяемыми начальными настройками прокси:

  1. Отключение настроек автоматического определения прокси в Internet Explorer
  2. Настройка проксив null:

    WebClient.Proxy = null

  3. При запуске приложения установите для веб-прокси по умолчанию значение null:

    WebRequest.DefaultWebProxy = null;

В более старом .NET-коде вместо установки на ноль, вы использовали для написания этого (но ноль теперь предпочтительнее):

webclient.Proxy = GlobalProxySelection.GetEmptyWebProxy();
0 голосов
/ 16 октября 2015

Может быть, это кому-нибудь поможет. Некоторые веб-сервисы поддерживают сжатие (gzip или другое). Таким образом, вы можете добавить заголовок Accept-Encoding для ваших запросов и затем включить автоматическая декомпрессия для экземпляра веб-клиента. Chrome работает таким образом.

...