Какая разница между классами WebClient и HTTPWebRequest в .NET? - PullRequest
173 голосов
/ 14 февраля 2011

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

Спасибо.

Ответы [ 3 ]

235 голосов
/ 14 февраля 2011

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

30 голосов
/ 21 октября 2012

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

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

25 голосов
/ 07 июля 2014

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

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"

...