WebClient vs. 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 має властивість заголовків, ви можете отримати файл cookie таким чином: String cookie = webClient.ResponseHeaders ("Set-Cookie") і встановити його: webClient.Headers.Add ("Cookie", " CommunityServer-UserCookie ... ");
День

14
За допомогою HttpWebRequest можна визначити тайм-аут. У WebClient це неможливо.
ripper234

14
@ Ripper234, на самому ділі це можливо , ви просто повинні наслідувати WebClient і перевизначити GetWebRequest налаштувати HttpWebRequest
Thomas Levesque

15
@ThomasLevesque, якщо ви успадковуєте webclient і переосмислюєте веб-запит, користуватися webclient видається безглуздим ...
Hagai L

5
@HagaiL, я не згоден ... Вам не потрібно створювати весь запит вручну, ви можете використовувати його base.GetWebRequestдля створення, а потім налаштувати лише те, що ви хочете
Thomas Levesque

54

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

WebClientне виставляє всіх цих (хоча ви можете підклас від WebClientта getaccess до об'єкта Запит).

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


13
Також є ще одне, що я забув згадати. WebClient - це компонентний об'єкт, тоді як HttpWebRequest - ні. Що це означає? Добре, якщо ви використовуєте VisualStudio для створення програми GUI, ви можете перетягнути / випустити компонент 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
Thomas Levesque

@ThomasLevesque Чи є сьогодні нова версія класів? Я бачу, що ця дискусія трохи, хм ... постаріла ...
Конрад Вільтерстен

@KonradViltersten, я не думаю, що змінилися в класі WebClient. Для нових додатків пропоную використовувати замість HttpClient, який також дуже простий у використанні та значно гнучкіший.
Томас Левеск

1
@ThomasLevesque Право, саме про це я думав. Я згадував http як різницю в назві класу і ввів в оману Http ... part. Тепер я знову на правильному шляху. Дякую!
Конрад Вільтерстен

12

Клас WebClient працює на потоці користувальницького інтерфейсу, тому інтерфейс користувача не реагує на час завантаження даних з Інтернету. З іншого боку, клас HttpWebRequest не блокує потік користувальницького інтерфейсу, і ваша програма чутлива. Так, у додатках, де потрібно завантажувати велику кількість даних з Інтернету або якщо джерело даних повільно отримує доступ, слід використовувати клас HttpWebRequest; у всіх інших випадках слід використовувати клас WebClient.


1
На WP7 - навпаки. HttpWebRequest маршалки повертаються до потоку інтерфейсу користувача в Манго, і це не спричинило мені скорботи. Grrr
Камерон Макфарланд

6
WebClient також підтримує асинхронні методи.
CyberMonk

6

Ще одним недоліком WebClientє те, що він ігнорує значення HTTP ContentType, charsetколи ви використовуєте його для отримання тексту відповіді. Ви повинні чітко встановити кодування через Encodingвластивість.


Це хороший момент; і це не лише питання налаштування Encoding- ви не можете знати кодування до запиту, тому програма WebClient робить це малоймовірним, що ви зможете належним чином завантажити рядок у невідомому кодуванні.
Еймон Нербонна

5

Ще одна річ HttpWebrquest дозволяє вам стиснути, але він Net.WebClient клас не підтримує стиснення HTTP


3
Як і всі інші приклади WebClient, які приховують деякі деталі, це можна виправити, підкласифікувавши WebClient і переосмисливши GetWebRequest. У цьому випадку ви просто налаштовуєте основну HttpWebRequest.AutomaticDecompressiongвластивість ).
патрон

5

"HtttpWebRequest" застарілий у .NET 4.5. Тепер цей клас є лише внутрішнім.


2
Справді. Використовуйте WebRequestзамість цього.
шовковий вогонь

2
Клас не застарілий, конструктори є. І клас не внутрішній, він все ще публічний.
user247702

2

Один приклад: розміщення даних та повернення оброблених даних за один цикл запитів / відповідей, здається, неможливо з WebClient, але це можна зробити за допомогою HtttpWebRequest.


2
Просто використовуйте WebClient.UploadString або WebClient.UploadData, щоб виконати POST і отримати рядок відповідей або байтовий масив.
samjudson

2
Для уточнення повернене значення UploadString - це рядок, а значення, що повертається методом UploadData, є масивом байтів.
Норман Н
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.