Подтвердить что ты не робот

HTTPWebResponse + StreamReader Очень медленно

Я пытаюсь реализовать ограниченный веб-искатель в С# (только для нескольких сотен сайтов) используя HttpWebResponse.GetResponse() и Streamreader.ReadToEnd(), также попытался использовать StreamReader.Read() и цикл для создания моей строки HTML.

Я только загружаю страницы размером около 5-10K.

Все очень медленно! Например, среднее время GetResponse() составляет примерно половину секунды, а среднее время StreamREader.ReadToEnd() составляет около 5 секунд!

Все сайты должны быть очень быстрыми, так как они очень близки к моему местоположению и имеют быстрые серверы. (в Explorer ничего не делает для D/L), и я не использую прокси-сервер.

В моем Crawler есть около 20 потоков, которые читаются одновременно с одного и того же сайта. Может ли это быть проблемой?

Как уменьшить StreamReader.ReadToEnd раза DRASTICALLY?

4b9b3361

Ответ 1

HttpWebRequest может занять некоторое время, чтобы обнаружить настройки прокси-сервера. Попробуйте добавить это в конфигурацию вашего приложения:

<system.net>
  <defaultProxy enabled="false">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>

Вы также можете увидеть небольшое усиление производительности при буферизации ваших чтений, чтобы уменьшить количество вызовов, сделанных в базовом сокете операционной системы:

using (BufferedStream buffer = new BufferedStream(stream))
{
  using (StreamReader reader = new StreamReader(buffer))
  {
    pageContent = reader.ReadToEnd();
  }
}

Ответ 2

WebClient DownloadString - простая оболочка для HttpWebRequest, вы можете попробовать использовать это временно и посмотреть, улучшится ли скорость? Если все будет намного быстрее, можете ли вы поделиться своим кодом, чтобы мы могли посмотреть, что может быть с ним не так?

EDIT:

Кажется, HttpWebRequest наблюдает за настройкой "максимальных одновременных подключений IE", являются ли эти URL-адреса в одном домене? Вы можете попытаться увеличить лимит соединений, чтобы узнать, помогает ли это? Я нашел эту статью о проблеме:

По умолчанию вы не можете выполнять больше чем 2-3 асинхронных HttpWebRequest (зависит на ОС). Чтобы отменить его (самый простой способ, ИМХО) не забывают добавить это под в конфигурации приложения Файл:

<system.net>
  <connectionManagement>
     <add address="*" maxconnection="65000" />
  </connectionManagement>
</system.net>

Ответ 3

У меня была та же проблема, но когда я установил параметр прокси-сервера HttpWebRequest равным null, он решил проблему.

UriBuilder ub = new UriBuilder(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( ub.Uri );
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Ответ 4

Вы пробовали ServicePointManager.maxConnections? Обычно я устанавливаю его в 200 для вещей, подобных этому.

Ответ 5

У меня была проблема с той же проблемой, но хуже. response = (HttpWebResponse) webRequest.GetResponse(); в моем коде задержка около 10 секунд перед запуском большего количества кода, и после этого загрузка насытила мое соединение.

kurt answer defaultProxy enabled = "false"

решил проблему. теперь ответ почти мгновенно, и я могу загрузить любой файл http на своих максимальных скоростях подключения:) извините за плохой английский

Ответ 6

Я обнаружил, что метод Application Config не работает, но проблема все еще была связана с настройками прокси-сервера. Мой простой запрос использовался до 30 секунд, теперь требуется 1.

public string GetWebData()
{
            string DestAddr = "http://mydestination.com";
            System.Net.WebClient myWebClient = new System.Net.WebClient();
            WebProxy myProxy = new WebProxy();
            myProxy.IsBypassed(new Uri(DestAddr));
            myWebClient.Proxy = myProxy;
            return myWebClient.DownloadString(DestAddr);
}

Ответ 7

Спасибо всем за ответы, они помогли мне копаться в правильном направлении. Я столкнулся с такой же проблемой производительности, хотя предлагаемое решение для изменения файла конфигурации приложения (поскольку я понял, что это решение для веб-приложений) не соответствует моим потребностям, мое решение показано ниже:

HttpWebRequest webRequest;

webRequest = (HttpWebRequest)System.Net.WebRequest.Create(fullUrl);
webRequest.Method = WebRequestMethods.Http.Post;

if (useDefaultProxy)
{
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
    webRequest.Credentials = CredentialCache.DefaultCredentials;
}
else
{
    System.Net.WebRequest.DefaultWebProxy = null;
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
}

Ответ 8

Почему многопоточная обработка не разрешает эту проблему? Многопоточность минимизирует время ожидания сети, и поскольку вы будете хранить содержимое буфера в системной памяти (ОЗУ), не будет узкого места IO от работы с файловой системой. Таким образом, ваши 82 страницы, которые занимают 82 секунды для загрузки и разбора, должны занимать 15 секунд (при условии, что процессор 4x). Исправьте меня, если я что-то упустил.

____ СКАЧАТЬ НИТЬ _____ *

Загрузка содержимого

Поток формы

Читать содержание

_________________________ *