Какая разница между классами WebClient и HTTPWebRequest в .NET?

Какая разница между классами WebClient и HttpWebRequest в .NET? Они оба делают очень похожие вещи. На самом деле, почему они не были объединены в один класс (слишком много методов/переменных и т.д. Могут быть одной из причин, но в .NET есть другие классы, которые нарушают это правило).

Спасибо.

Ответ 1

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 хорош для того, когда вам нужно больше контролировать весь запрос.

Ответ 2

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

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"

Ответ 3

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

Обходной путь для этой проблемы находится здесь fooobar.com/info/13673/...