Альтернатива WebClient - PullRequest
       7

Альтернатива WebClient

3 голосов
/ 20 декабря 2009

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

И когда я использую WebClient для загрузки страниц, а затем анализирую их локально, почему WebClient требуется около 40 секунд, чтобы загрузить одну веб-страницу? Есть ли альтернатива загрузке веб-страниц?

спасибо:)

Ответы [ 5 ]

6 голосов
/ 20 декабря 2009

Несколько вещей для рассмотрения:

  • Сколько страниц вы скачиваете одновременно? Сканеры, как правило, работают очень параллельно.
  • По умолчанию .NET Framework ограничивает количество параллельных запросов для одного сайта. Как правило, это хорошая вещь - вы можете немного поднять лимит, но в идеале ориентироваться на разные сайты параллельно. Элемент <connectionManagement> - это тот, на который вам нужно обратить внимание.
  • Использовали ли вы WireShark , чтобы увидеть, что происходит на уровне сети? Если на обслуживание веб-сайта уходит 40 секунд, трудно понять, как может помочь переход с использования WebClient.
  • Не могли бы вы опубликовать код, чтобы точно показать, что вы делаете?

Возможно возможно , что использование другого API (возможно, даже просто WebRequest) ускорит процесс, но вам действительно нужно сначала найти текущее узкое место.

2 голосов
/ 20 декабря 2009

Почти наверняка существует другая проблема с вашим кодом, которую нелегко обнаружить с помощью информации, которую вы опубликовали.

С другой стороны, при создании сканера C # мы обнаружили, что API WebRequest / WebClient очень сильно загружает процессор и в конечном итоге не подходит для сканирования. В конце мы написали свой собственный стек HTTP, используя методы Socket.XxxxAsync, которые снизили нагрузку на процессор примерно в 20 раз. Имейте в виду, что на этом пути стоит довольно крутая кривая обучения.

1 голос
/ 20 декабря 2009

Было несколько сообщений о том, что Webclient работает медленно, если есть экземпляр прокси по умолчанию. MSDN Social содержит те же подробности об этом. Есть несколько вещей, которые нужно сделать, чтобы сделать это быстрее, включая использование асинхронных соединений, потоков и, если вам действительно нужна производительность, написание кода сокета самостоятельно. На рынке есть несколько библиотек, которые утверждают, что они обеспечивают повышение над библиотеками фреймворка по умолчанию, они могут быть полезны, если вы готовы за них доплачивать.

У меня есть несколько программ, которые используют Webrequest (не нативный веб-клиент), и я вижу пропускную способность в диапазоне, близком к МБ / с, с ресурсами в диапазоне 10-20 МБ, поступающими с половины света. Так что это определенно возможно с фреймворком изначально.

1 голос
/ 20 декабря 2009

Есть несколько причин, по которым вы можете получить низкую производительность:

  • Не использование асинхронных методов / потоков
  • Плохой алгоритм парсинга HTML
  • Страница, которую вы загружаете с WebClient, работает медленно

Для точного ответа потребуется дополнительная информация / исходный код.

0 голосов
/ 19 сентября 2012

Эти настройки могут помочь, если вы испытываете замедление во время сканирования.

ServicePointManager.DefaultConnectionLimit = int.MaxValue;
ServicePointManager.MaxServicePoints = int.MaxValue;
ServicePointManager.MaxServicePointIdleTime = 0;

Кроме того, не забудьте закрыть HttpWebRequest, если поднимите код до уровня.

HttpWebResponse.Close();
HttpWebResponse.GetResponseStream().Close();
HttpWebResponse.GetResponseStream().Dispose();

Mike

...