it-swarm-ru.tech

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

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

Благодарю.

173
GurdeepS

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

235
John Sheehan

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

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

30
Andriy F.

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

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"

25
SHEKHAR SHETE