Какая разница между классами 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 с базовой аутентификацией некоторое время назад. Я могу согласиться с этим. Так ты сделал RestSharp? Прохладно!
GurdeepS

19
Любой, кто сталкивался с таким, как я, только что заметил, что на поле появился новый игрок под названием HttpClient который поставляется с .NET 4.5, который может (или не может?) Решить некоторые из вышеупомянутых проблем ...
Funka

3
WebClient реализует IDisposable, поэтому вы должны подумать об этомusing (WebClient client = new WebClient())
Eric

32

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

Обойти эту проблему можно здесь https://stackoverflow.com/a/3052637/1303422


16
Вопрос был в чем разница. Одно из отличий состоит в том, что у WebClient нет свойства тайм-аута, в то время как у HttpWebRequest есть.
Андрей Ф.

26

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

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

Это WebRequestабстрактный базовый класс. Таким образом, вы на самом деле не используете его напрямую. Вы используете его через производные классы - HttpWebRequestиFileWebRequest .

Вы используете метод Create WebRequestдля создания экземпляра 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данные из ресурса, обозначенного 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 позволяет нам добавить тип метода запроса, т.е. Get / Post со свойством METHOD. где WebClient не имеет никакой функциональности добавления типа метода.
SHEKHAR SHETE

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