Почему улучшается производительность объекта 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. Когда я вернул это значение по умолчанию, мои запросы пошли намного быстрее без скрипача.

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