HTTPWebResponse + StreamReader Очень Медленный - PullRequest
20 голосов
/ 23 мая 2009

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

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

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

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

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

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

Ответы [ 8 ]

15 голосов
/ 23 декабря 2009

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();
  }
}
8 голосов
/ 23 мая 2009

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

EDIT:

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

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

<system.net>
  <connectionManagement>
     <add address="*" maxconnection="65000" />
  </connectionManagement>
</system.net>
4 голосов
/ 23 сентября 2010

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

UriBuilder ub = new UriBuilder(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( ub.Uri );
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
1 голос
/ 24 июня 2010

Я обнаружил, что метод 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);
}
1 голос
/ 21 февраля 2010

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

ответ Курта defaultProxy enabled = "false"

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

1 голос
/ 14 февраля 2010

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

0 голосов
/ 31 декабря 2014

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

____ ЗАГРУЗИТЬ РЕЗЬБУ _____ *

Скачать содержимое

Форма потока

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

_________________________ *

0 голосов
/ 08 февраля 2012

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

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