Почему производительность объекта HttpWebRequest повышается при использовании Fiddler?

StackOverflow https://stackoverflow.com/questions/1022844

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня очень странное поведение с 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, я вижу соответствующее увеличение сетевой активности.TCP-соединения для консольного процесса теперь указывают удаленный адрес как «петлю IPv4», а не IP-адрес целевого сервера (ожидается).Я задавался вопросом о максимальном количестве одновременных HTTP-запросов, разрешенных машиной, но изменение этого значения в реестре, похоже, не имеет значения.

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

Спасибо!

Это было полезно?

Решение

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

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

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

Другие советы

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

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 время, необходимое для настройки сценария.Это может произойти только один раз, а не при каждом запросе.

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

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

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

Что кажется чтобы сделать свое дело.Я бегу уже почти 24 часа без тайм-аута и без запуска Fiddler.

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

пытаться

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

_httpWebRequest.CookieContainer = _cookieContainer;//с переработкой контейнера cookie

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top