Почему производительность объекта HttpWebRequest улучшается при использовании Fiddler? - PullRequest
10 голосов
/ 21 июня 2009

Я получаю очень странное поведение с HttpWebRequest, надеюсь, мне кто-нибудь поможет. У меня есть консольное приложение, которое выполняет некоторую агрегацию, используя объект HttpWebRequest для извлечения содержимого целевого веб-сайта. Из-за характера требований приложение является многопоточным и пытается установить от 10 до 30 одновременных соединений (я экспериментировал с диапазоном значений). Фактический веб-запрос имеет следующую структуру:

var req = (HttpWebRequest)WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();
var sr = new StreamReader(s, Encoding.ASCII);
string doc = sr.ReadToEnd();
sr.Close();
resp.Close();
return doc;

В любом случае, странное поведение заключается в том, что при нормальных обстоятельствах приложение выполняет около 120 запросов в минуту, но если я открою Fiddler, оно скачет примерно до 600. Используя Windows 7 Resource Monitor, я вижу, как соответственно увеличивается сетевая активность. Соединения TCP для процесса консоли теперь отображают удаленный адрес как «IPv4 loopback», а не IP-адрес целевого сервера (ожидается). Я задавался вопросом о максимальном количестве одновременных HTTP-запросов, разрешенных машиной, но изменение этого в реестре, похоже, не имеет значения.

Итак, вопрос в том; что такое запуск Fiddler, который внезапно увеличивает пропускную способность в пять раз, и как я могу добиться этого на машине без необходимости запуска другого инструмента?

Спасибо!

Ответы [ 7 ]

14 голосов
/ 21 июня 2009

Похоже, что теперь я смог повысить пропускную способность (вдвое больше, чем при открытом Fiddler), установив максимальное количество соединений в App.config:

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

Очень доволен результатом, но все еще немного озадачен тем, почему открытие Fiddler изменило результаты так резко.

5 голосов
/ 21 июня 2009

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

var req = WebRequest.Create(url);
using (WebResponse resp = req.GetResponse())
{
    using (Stream s = resp.GetResponseStream())
    {
        using (var sr = new StreamReader(s, Encoding.ASCII))
        {
            return sr.ReadToEnd();
        }
    }
}

Далее, к вашему сведению, Fiddler действует как прокси. Если ваш прокси-сервер по умолчанию был настроен на использование скрипта для настройки прокси-сервера, то мне интересно, не может ли запуск Fiddler отнять время, необходимое для настройки скрипта. Это может произойти только один раз, а не при каждом запросе.

1 голос
/ 24 октября 2009

У меня была проблема, похожая на вашу, и я хотел бы поделиться своим решением.

Короче говоря, у меня была консольная программа, которая выполняла HTTP-запросы и через 15 минут или около того истекала. Однако, если бы я использовал Fiddler, то у меня никогда не было таймаутов, даже после того, как он работал в течение нескольких дней подряд.

Я попытался установить свойство maxconnections в App.config, но, похоже, это не помогло. Затем я вошел и все без исключения ссылки на HttpWebRequest, HttpWebResponse и потоковые объекты, используемые для чтения / записи данных в эти объекты, используя блоки.

То, что кажется , добилось цели. Я работаю почти 24 часа без таймаута и без запуска Fiddler.

0 голосов
/ 27 марта 2013

Для меня я устанавливал request.ProtocolVersion = HttpVersion.Version10;

Значение по умолчанию для этого - HttpVersion.Version11. Когда я вернул значение по умолчанию, мои запросы пошли намного быстрее без фиддлера.

Надеюсь, это поможет кому-то еще, мне понадобилось все утро, чтобы понять это!

0 голосов
/ 09 декабря 2011

У меня была такая же проблема. Я скачал это: http://www.wowinterface.com/downloads/info13581-LeatrixLatencyFix.html Это было причиной выполнения HttpWebRequest. Он изменяет TCPAckFrequency и полностью портит все. Я удалил его, и теперь он работает.

0 голосов
/ 22 апреля 2011

У нас была такая же проблема, установите для вашего httpWebRequest.PreAuthenticate значение true.

у вас больше не должно быть ответа 401, поэтому вы будете открывать меньше соединений ...

0 голосов
/ 30 марта 2010

То, как вы запрашиваете, создает новый сеанс для каждого вызова, что накладно, возможно, что фидлер добавляет сеанс к вашим запросам ....

попробовать

приватный статический CookieContainer _cookieContainer = new CookieContainer ();

_httpWebRequest.CookieContainer = _cookieContainer; // с утилизацией контейнера для печенья

...