Веб-клиент против HttpWebRequest / HttpWebResponse

132

Мне кажется, что большую часть того, что можно сделать, HttpWebRequest/Responseможно сделать и с WebClientклассом. Я где-то читал, что WebClientэто оболочка высокого уровня для WebRequest/Response.
Пока я не вижу ничего, что можно было бы сделать с помощью того, HttpWebRequest/Responseчего нельзя было бы сделать WebClient, и где HttpWebRequest / Response предоставит вам более «детальный» контроль.

Когда мне следует использовать WebClient и когда HttpWebRequest/Response? (Очевидно, HttpWebRequest/Responseони специфичны для HTTP.)

Если HttpWebRequest/Responseуровень ниже, то WebClientчто я могу сделать с HttpWebRequest/Responseтем, с чем не могу WebClient?

Дэн
источник

Ответы:

87

Использование HttpWebRequestдает вам больше контроля над запросом. Вы можете установить файлы cookie, заголовки, протокол и т. Д. В ответе вы также можете получить файлы cookie и заголовки.

Томас Левеск
источник
14
Томас, все еще не убежденный ... У WebClient есть свойство Headers, вы можете получить файл cookie следующим образом: String cookie = webClient.ResponseHeaders («Set-Cookie») и установить его: webClient.Headers.Add («Cookie», » CommunityServer-UserCookie ... ");
Дэн
14
Используя HttpWebRequest, вы можете определить тайм-аут. В WebClient это невозможно.
рыхлитель234
14
@ ripper234, на самом деле это возможно , вы просто должны наследовать WebClient и переопределить GetWebRequest настроить HttpWebRequest
Thomas Levesque
15
@ThomasLevesque, если вы наследуете веб-клиент и переопределяете веб-запрос, использование веб-клиента кажется бессмысленным ...
Hagai L
5
@HagaiL, я не согласен ... Вам не нужно создавать весь запрос вручную, вы можете использовать его base.GetWebRequestдля его создания, а затем настраивать именно то, что хотите
Томас Левеск
54

HttpWebRequest предоставляет гораздо больше вещей, которые позволяют вам детально контролировать протокол, например: хотите ли вы использовать Keep-Alive, какой пул соединений использовать, буферизовать ли записи или нет и т. д.

WebClientне раскрывает все из них (хотя вы можете WebClientсоздать подкласс и получить доступ к базовому объекту Request).

WebClientполезно для тех ситуаций , когда вы просто хотите сделать операцию (например: POST / GET / Форма загрузки) и не можете быть обеспокоены , чтобы создавать и управлять HttpWebRequest, RequestStream, HttpWebResponseи поток ответа.

Ферозе
источник
13
Кроме того, я забыл упомянуть еще одну вещь. WebClient является объектом Component, а HttpWebRequest - нет. Что это значит? Что ж, если вы используете VisualStudio для создания приложения с графическим интерфейсом, вы можете перетащить компонент WebClient в свою форму и использовать его для отправки запросов к серверам HTTP / FTP и т. Д.
feroze
14

Из блога Тима Хойера - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

Вместо этого в Silverlight вы захотите использовать WebClient или HttpWebRequest. Какая разница? Вот версия Timheuer. WebClient - это более простая реализация, которая очень легко выполняет запросы GET и получает поток ответов. HttpWebRequest отлично подходит, когда вам нужно немного более детально контролировать запрос, нужно отправлять заголовки или другие настройки.

Бенджамин Кокс
источник
7
WebClient также поддерживает POST с UploadString, UploadData и UploadFile
Томас Левеск,
@ThomasLevesque Есть ли сегодня более новая версия классов? Я вижу, что это обсуждение немного, хм ... в возрасте ...
Конрад Вилтерстен
@KonradViltersten, я не думаю, что класс WebClient сильно изменился. Для новых приложений я предлагаю вам вместо этого использовать HttpClient, который также очень прост в использовании и гораздо более гибкий.
Томас Левеск
1
@ThomasLevesque Верно, это было то, о чем я думал. Я вспомнил http как разницу в имени класса и был введен в заблуждение частью Http ... Теперь я снова на правильном пути. Спасибо!
Конрад Вильтерстен,
12

Класс WebClient работает в потоке пользовательского интерфейса, поэтому пользовательский интерфейс не отвечает, пока данные загружаются из Интернета. С другой стороны, класс HttpWebRequest не блокирует поток пользовательского интерфейса, и ваше приложение реагирует. Итак, в приложениях, в которых должен быть загружен большой объем данных из Интернета или если доступ к источнику данных медленный, следует использовать класс HttpWebRequest; во всех остальных случаях следует использовать класс WebClient.

Баазиз
источник
1
С WP7 все наоборот. HttpWebRequest возвращается к потоку пользовательского интерфейса в Mango, вызывая у меня нескончаемое горе. Grrr
Кэмерон МакФарланд
6
WebClient также поддерживает асинхронные методы.
CyberMonk
6

Другой недостаток WebClientзаключается в том, что он игнорирует значение HTTP ContentType, charsetкогда вы используете его для получения текста ответа. Вы должны явно указать кодировку через Encodingсвойство.

Сэм
источник
Это хорошая точка; и это не просто вопрос установки Encoding- вы не можете узнать кодировку до момента запроса, поэтому API WebClient делает очень маловероятным, что вы сможете правильно загрузить строку в неизвестной кодировке.
Eamon Nerbonne
5

Еще одна вещь, которую HttpWebrquest позволяет сжатие, но класс Net.WebClient не поддерживает сжатие HTTP.

Заин Али
источник
3
Как и все другие примеры WebClient, скрывающие некоторые детали, это можно исправить, создав подкласс WebClient и переопределив GetWebRequest. В этом случае вы просто настраиваете базовое HttpWebRequest.AutomaticDecompressiongсвойство ).
Patridge
5

«HtttpWebRequest» устарел в .NET 4.5. Теперь этот класс является только внутренним.

Хулио Спейдер
источник
2
На самом деле. Используйте WebRequestвместо этого.
silkfire 01
2
Класс не устарел, конструкторы устарели. И класс не внутренний, он по-прежнему публичный.
user247702 08
2

Один пример: публикация данных и получение обратно обработанных данных за один цикл запроса / ответа кажется невозможным с помощью WebClient, но вы можете сделать это с помощью HtttpWebRequest.

синергетический
источник
2
Просто используйте WebClient.UploadString или WebClient.UploadData, чтобы выполнить POST и получить обратно строку ответа или массив байтов.
samjudson
2
Чтобы уточнить, возвращаемое значение UploadString - это строка, а возвращаемое значение метода UploadData - массив байтов.
Norman H