Какая разница между классами 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/...