Почему улучшается производительность объекта HttpWebRequest при использовании Fiddler?
Я получаю очень странное поведение с 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-соединения для процесса консоли теперь перечисляют удаленный адрес как "loopback IPv4", а не IP-адрес целевого сервера (ожидается). Я действительно задавался вопросом о максимальном количестве одновременных HTTP-запросов, разрешенных машиной, но изменение этого в реестре, похоже, не имеет значения.
Итак, вопрос: что происходит с запуском Fiddler, который внезапно увеличивает пропускную способность в пять раз и как я могу добиться этого изначально на машине без необходимости запуска другого инструмента?
Спасибо!
Ответы
Ответ 1
Похоже, теперь я смог получить пропускную способность (в два раза больше, чем я получал с открытием Fiddler), установив максимальные соединения в App.config:
<system.net>
<connectionManagement>
<add address="*" maxconnection="30" />
</connectionManagement>
</system.net>
Очень доволен результатом, но я все еще немного озадачен тем, почему открытие Fiddler резко изменило результаты.
Ответ 2
Одна вещь, которую я сразу заметил, это то, что вы не используете блоки. Это добавляет фактор случайности, который может быть умножен на количество запросов, поэтому я предлагаю вам исправить это:
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();
}
}
}
Далее, FYI, Fiddler действует как прокси. Если ваш прокси-сервер по умолчанию был настроен на использование script для настройки конфигурации прокси-сервера, я задаюсь вопросом, может ли запуск Fiddler не удалять время, необходимое для установки script. Это может произойти только один раз, а не по каждому запросу.
Ответ 3
У меня была проблема, похожая на вашу, и мне хотелось поделиться своим разрешением.
Короче говоря, у меня была консольная программа, которая делала HTTP-запросы, и через 15 минут или около того тайм-аут. Однако, если я использовал Fiddler, я никогда не испытывал тайм-аутов, даже после того, как он работал в течение нескольких дней подряд.
Я попытался установить свойство maxconnections в App.config, но это, похоже, совсем не помогло. Затем я вошел и все ссылки на HttpWebRequest, HttpWebResponse и объекты потока, используемые для чтения/записи данных на эти объекты в рамках использования блоков.
Это похоже на трюк. Я работал почти 24 часа без тайм-аута и без Fiddler.
Ответ 4
То, как вы запрашиваете, вызывает создание нового сеанса для каждого вызова, что является накладным, может быть, что скрипач добавляет сеанс к вашим запросам....
попробовать
private static CookieContainer _cookieContainer = новый CookieContainer();
_httpWebRequest.CookieContainer = _cookieContainer;//с рециркуляцией cookiecontainer
Ответ 5
У нас была та же проблема,
установите для параметра httpWebRequest.PreAuthenticate значение true.
у вас больше не должно быть ответа 401, поэтому вы будете открывать меньше подключений...
Ответ 6
У меня была та же проблема. Я скачал это:
http://www.wowinterface.com/downloads/info13581-LeatrixLatencyFix.html
Это стало причиной выполнения HttpWebRequest. Он изменяет TCPAckFrequency и полностью испортит все. Я удалил его, и теперь ЭТО РАБОТАЕТ.
Ответ 7
Для меня я устанавливал request.ProtocolVersion = HttpVersion.Version10;
По умолчанию это HttpVersion.Version11. Когда я вернул это значение по умолчанию, мои запросы пошли намного быстрее без скрипача.
Я надеюсь, что это поможет кому-то другому, мне все утро понадобилось, чтобы понять это!