Классы HttpWebRequest и HttpWebResponse

Платформа .NET Framework для работы с протоколом HTTP предоставляет два основных класса. Один из них отвечает за запрос – класс HttpWebRequest, а другой за ответ – HttpWebResponse.

Приведу пример простой программы, с использованием данных классов, которая получает из интернета указанную страничку:

static void Main()
{
string uri = "http://mycsharp.ru/post/49/2015_03_02_setevoe_programmirovanie_v_si-sharp.html";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());
Console.ReadLine();
}


Сначала создается объект запроса при помощи статического метода Create класса WebRequest, в который передается адрес запрашиваемого ресурса. При этом возвращаемый объект необходимо привести к типу HttpWebRequest, потому как метод Create возвращает различный объект запроса, основываясь на том, какой URI ему передали, это может быть, как в нашем случае, HTTP запрос, так и запрос к файловой системе (при этом возвращается объект FileWebRequest).

Дальше мы создаем объект ответа HttpWebResponse путем вызова метода GetResponse у объекта запроса (при этом приводим его к типу HttpWebResponse). При вызове этого метода, на сервер отправляется запрос, и в результате мы получаем объект HttpWebResponse который содержит HTTP-заголовки, а также поток, с которого мы можем считать тело ответа.

Дальше создается объект чтения потока StreamReader, в его конструктор передается поток ответа, который возвращает метод GetResponseStream, указываем необходимую кодировку, и выводим данные на экран. В результате мы увидим HTML код запрашиваемой страницы.

Работа с HTTP-заголовками

Для работы с заголовками у обоих классов HttpWebRequest и HttpWebResponseесть свойство Headers (объект типа WebHeaderCollection) которое предоставляет информацию о заголовках запроса и ответа соответственно. Для добавления или установки заголовков используются методы Add и Set. Метод Add принимает один строковый аргумент – заголовок полностью в формате "имя: значение":

request.Headers.Add("Content-Language: en, ru");

Метод Set принимает два строковых аргумента – имя и значение:

request.Headers.Set("Content-Language", "en, ru");

Использовать можно любой из этих методов, но кроме такой "ручной" установки заголовков есть еще возможность задать значения некоторых распространенных заголовков, используя соответствующие свойства в классах HttpWebRequest и HttpWebResponse. Например, установка заголовка Referer:

request.Referer = "http://google.com";

Доступ к конкретному заголовку осуществляется при помощи той же коллекции Headers (коллекция пар имя-значение WebHeaderCollection). В квадратных скобках указываем имя заголовка, и получаем его значение:

Console.WriteLine(response.Headers["date"]); // Tue, 07 Apr 2015 17:29:04 GMT

Считать все заголовки можно так:

foreach(string header in response.Headers)
Console.WriteLine("{0}: {1}", header, response.Headers[header]);

Вывод будет таким:

Content-Length: 77352
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Tue, 07 Apr 2015 17:29:04 GMT
Set-Cookie: ASP.NET_SessionId=3nq4lu3qep3bb3vj2gnhmqdf; path=/; HttpOnly
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

В примерах выше все запросы выполнялись методом "GET".У классов HttpWebRequest и HttpWebResponse есть свойство Method. Для запроса оно по умолчанию установлено как "GET", но его можно изменить, например на "POST", об этом методе и будет следующий урок. Для ответа же это свойство только на чтение.

Домашнее задание

Ваша программа должна выводить в консоль заголовки уроков с главной страницы сайта (те, что в центральной колонке, 8 последних). Кроме этого, я настроил сервер так, что если заголовок user-agent при запросе к главной странице сайта равен значению "lesson34", то в ответ вы получите не главную страницу, а страницу контактов. Установите значение "lesson34" для этого заголовка и убедитесь, что это работает.

Наши рекомендации