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();