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

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

Это очень медленно. Для загрузкиString с одного веб-сайта требуется около 3-5 секунд. У меня нет сетевых проблем.

Это мой Modifed WebClient.

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: В wirehark я увидел, что единственный DownladString отправляет и принимает несколько тысяч пакетов.

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

  • Отключить параметры автоматического определения прокси-сервера в Internet Explorer
  • Задайте прокси-серверу null:

    WebClient.Proxy = null

  • При запуске приложения установите для webproxy по умолчанию значение null:

    WebRequest.DefaultWebProxy = null;

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

webclient.Proxy = GlobalProxySelection.GetEmptyWebProxy();