Яка різниця між класами WebClient і HTTPWebRequest у .NET?


178

Яка різниця між WebClientі на HttpWebRequestкласи в .NET? Вони обоє роблять дуже схожі речі. Насправді, чому вони не були об'єднані в один клас (занадто багато методів / змінних тощо може бути однією з причин, але в .NET є інші класи, які порушують це правило).

Дякую.

Відповіді:


242

WebClient - це абстракція вищого рівня, побудована на версії HttpWebRequest для спрощення найбільш поширених завдань. Наприклад, якщо ви хочете вивести вміст з HttpWebResponse, вам потрібно прочитати з потоку відповідей:

var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

З WebClient ви просто робите DownloadString:

var client = new WebClient();
var content = client.DownloadString("http://example.com");

Зауважте: я коротко usingвідмовився від обох прикладів. Вам обов'язково слід подбати про правильне розміщення об’єктів веб-запиту.

Взагалі, WebClient хороший для швидких та брудних простих запитів, а HttpWebRequest підходить тоді, коли вам потрібен більший контроль над усім запитом.


34
Сказане є фактом, наступне - думка: обидва страшні, оскільки HttpWebRequest порушений. Він обробляє основні автентичні помилки, вимагає дивних способів вирішення проблем, як ServicePointManager.Expect100Continue = false, наприклад , інших нестандартних речей і має багато примх і ідіосинкрасій. Я запустив RestSharp, щоб допомогти згладити ці проблеми.
Джон Шихан

4
Також зауважте, що WebClient є компонентом, тому ви можете перетягнути / випустити його з вікна інструментів VS у свою форму і мати можливість використовувати його там.
feroze

1
Я думаю, я намагався використовувати httpwebrequest з базовим auth деякий час тому. Я можу погодитися з цим. Так ви зробили RestSharp? Класно!
GurdeepS

19
Кожен, хто HttpClientстикається з цим, як я щойно, зауважте, на полі, який називається .NET 4.5, є новий гравець, який постачається разом з .NET 4.5, який може (чи не може?) Вирішити деякі з вищезазначених проблем ...
Funka

3
WebClient реалізує IDisposable, тож варто подумати про те, що робитиusing (WebClient client = new WebClient())
Ерік

32

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

Вирішення цієї проблеми можна знайти тут https://stackoverflow.com/a/3052637/1303422


16
Питання було в чому різниця. Однією з відмінностей є те, що WebClient не має властивості таймауту, а HttpWebRequest.
Андрій Ф.

26

Я знаю, що це занадто давно відповідати, але просто як інформаційна мета для майбутніх читачів:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

Це WebRequestабстрактний базовий клас. Таким чином, ви фактично не використовуєте його безпосередньо. Ви використовуєте його через похідні класи - HttpWebRequestі FileWebRequest.

WebRequestДля створення екземпляра ви використовуєте метод Create WebRequest. GetResponseStreamповертає data stream.

Є також FileWebRequestі FtpWebRequestкласи, які inheritз WebRequest. Як правило, ви б хотіли WebRequestзробити запит і перетворити повернення в або HttpWebRequest, FileWebRequestабо FtpWebRequestзалежати від вашого запиту. Нижче наведено приклад:

Приклад:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientнадає загальні операції sendingта receivingдані з ресурсу, визначеного a URI. Просто це абстракція вищого рівня HttpWebRequest. Це «загальні операції» є те , що відрізнити WebClientвід HttpWebRequest, як і показано в зразку нижче:

Приклад:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

Також існують DownloadDataі DownloadFileоперації, що знаходяться під WebClientпримірником. Ці загальні операції також спрощують код того, що ми зазвичай робимо HttpWebRequest. Використовуючи HttpWebRequest, ми повинні отримати відповідь на наш запит, миттєво StreamReaderпрочитати відповідь і, нарешті, перетворити результат у будь-який тип, який ми очікуємо. З WebClient, ми просто просто дзвонимо DownloadData, DownloadFile or DownloadString.

Однак майте на увазі, що WebClient.DownloadStringне враховуєте encodingресурс, про який ви запитуєте. Отже, ви, ймовірно, отримаєте дивні символи, якщо не вкажете і не кодуєте.

ПРИМІТКА. В основному " WebClient займає кілька рядків коду порівняно з Webrequest "


Чи використовує клас WebClient Post / Get метод ..? Надайте, будь ласка, посилання, щоб описати
Kartiikeya

WebRequest дозволяє нам додати тип методу запиту, тобто отримати / опублікувати з властивістю METHOD. де WebClient не мають функцій додавання типу методу.
ШЕХАР ШЕЙТ

1
@SHEKHARSHETE Мені вдалося webClient.UploadData(url, "POST", bytes)вказати метод (див. Документи MSDN ).
Джефф Б
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.