Книга: C# 4.0: полное руководство

Доступ к дополнительной информации, получаемой в ответ по протоколу HTTP

Доступ к дополнительной информации, получаемой в ответ по протоколу HTTP

С помощью сетевых средств, имеющихся в классе HttpWebResponse, можно получить доступ к другой информации, помимо содержимого указываемого ресурса. К этой информации, в частности, относится время последней модификации ресурса, а также имя сервера. Она оказывается доступной с помощью различных свойств, связанных с получаемым ответом. Все эти свойства, включая и те что, определены в классе WebResponse, сведены в табл. 26.5. В приведенных далее примерах программ демонстрируется применение этих свойств на практике.

Таблица 26.5. Свойства, определенные в классе HttpWebResponse

Свойство - Описание

public string CharacterSet { get; } - Получает название используемого набора символов

public string ContentEncoding { get; } - Получает название схемы кодирования

public long ContentLength { get; } - Получает длину принимаемого содержимого. Если она недоступна, свойство имеет значение -1

public string ContentType { get; } - Получает описание содержимого

public CookieCollection Cookies { get; set; } - Получает или устанавливает список cookie-наборов, присоединяемых к ответу

public WebHeaderCollection Headers! get; } - Получает коллекцию заголовков, присоединяемых к ответу

public bool IsFromCache { get; } - Принимает логическое значение true, если запрос получен из кеша. А если запрос доставлен по сети, то принимает логическое значение false

public bool IsMutuallyAuthenticated { get; } - Принимает логическое значение true, если клиент и сервер опознают друг друга, а иначе — принимает логическое значение false

public DateTime LastModified { get; } - Получает время последней модификации ресурса

public string Method { get; } - Получает строку, которая задает способ ответа

public Version ProtocolVersion { get; } - Получает объект типа Version, описывающий версию протокола HTTP, используемую в транзакции

public Uri ReponseUri { get; } - Получает URI, по которому был сформирован ответ. Этот идентификатор может отличаться от запрашиваемого, если ответ был переадресован по другому URI

public string Server { get; } - Получает строку, обозначающую имя сервера

public HttpStatusCode StatusCode { get; } - Получает объект типа HttpStatusCode, описывающий состояние транзакции

public string StatusDescription { get; } - Получает строку, обозначающую состояние транзакции в удобочитаемой форме

Доступ к заголовку

Для доступа к заголовку с информацией, получаемой в ответ по протоколу HTTP, служит свойство Headers, определенное в классе HttpWebResponse.

public WebHeaderCollection Headers{ get; }

Заголовок протокола HTTP состоит из пар "имя-значение", представленных строками. Каждая пара "имя-значение" хранится в коллекции класса WebHeaderCollection. Эта коллекция специально предназначена для хранения пар "имя-значение" и применяется аналогично любой другой коллекции (подробнее об этом см. в главе 25). Строковый массив имен может быть получен из свойства AllKeys, а отдельные значения — по соответствующему имени при вызове метода GetValues(). Этот метод возвращает массив строк, содержащий значения, связанные с заголовком, передаваемым в качестве аргумента. Метод GetValues() перегружается, чтобы принять числовой индекс или имя заголовка.

В приведенной ниже программе отображаются заголовки, связанные с сетевым ресурсом, доступным по адресу www. McGraw-Hill. com.

// Проверить заголовки.
using System;
using System.Net;
class HeaderDemo {
  static void Main() {
    // Создать объект запроса типа WebRequest по указанному URI.
    HttpWebRequest req = (HttpWebRequest)
    WebRequest.Create("http://www.McGraw-Hill.com");
    // Отправить сформированный запрос и получить на него ответ.
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
    // Получить список имен.
    string[] names = resp.Headers.AllKeys;
    // Отобразить пары "имя-значение" из заголовка.
    Console.WriteLine("{0,-20}{1}", "Имя", "Значение");
    foreach (string n in names) {
      Console.Write("{0,-20}", n);
      foreach (string v in resp.Headers.GetValues(n))
        Console.WriteLine(v);
    }
    // Закрыть ответный поток, resp.Close();
  }
}

Ниже приведен полученный результат. Не следует забывать, что информация в заголовке периодически меняется, поэтому у вас результат может оказаться несколько иным.

Имя                 Значение
X-Server-Name       va-c1-r4-u27-b1
X-Cache             MISS from proxy.ukr.zal
X-Cache-Lookup      MISS from proxy.ukr.zal:3129
Connection          keep-alive
Content-Length      4442
Content-Type        text/html;charset=utf-8
Date                Wed, 27 Jul 2016 09:01:26 GMT
Last-Modified       Mon, 25 Jul 2016 11:57:20 GMT
Server              Apache

(В оригинале приведено:)

Имя                 Значение
Transfer-encoding   chunked
Content-Type        text/html
Date                Sun, 06 Dec 2009 20:32:06 GMT
Server              Sun-ONE-Web-Server/6.1

Доступ к cookie-наборам

Для доступа к cookie-наборам, получаемым в ответ по протоколу HTTP, служит свойство Cookies, определенное в классе HttpWebResponse. В cookie-Ha6opax содержится информация, сохраняемая браузером. Они состоят из пар "имя-значение" и упрощают некоторые виды доступа к веб-сайтам. Ниже показано, каким образом определяется свойство Cookies.

public CookieCollection Cookies { get; set; }

В классе CookieCollection реализуются интерфейсы ICollection и IEnumerable, и поэтому его можно использовать аналогично классу любой другой коллекции (подробнее об этом см. в главе 25). У этого класса имеется также индексатор, позволяющий получать cookie-Ha6op по указанному индексу или имени.

В коллекции типа CookieCollection хранятся объекты класса Cookie. В классе Cookie определяется несколько свойств, предоставляющих доступ к различным фрагментам информации, связанной с cookie-набором. Ниже приведены два свойства, Name и Value, используемые в примерах программ из этой главы.

public string Name { get; set; }
public string Value { get; set; }

Имя cookie-Ha6opa содержится в свойстве Name, а его значение — в свойстве Value.

Для того чтобы получить список cookie-наборов из принятого ответа, необходимо предоставить сооkiе-контейнер с запросом. И для этой цели в классе HttpWebRequest определяется свойство CookieContainer, приведенное ниже.

public CookieContainer CookieContainer { get; set; }

В классе CookieContainer предоставляются различные поля, свойства и методы, позволяющие хранить сооkiе-наборы. По умолчанию свойство CookieContainer содержит пустое значение. Для того чтобы воспользоваться cookie-наборами, необходимо установить это свойство равным экземпляру класса CookieContainer. Во многих приложениях свойство CookieContainer не применяется непосредственно, а вместо него из принятого ответа составляется и затем используется коллекция типа CookieCollection. Свойство CookieContainer просто обеспечивает внутренний механизм сохранения cookie-наборов.

В приведенном ниже примере программы отображаются имена и значения cookie-наборов, получаемых из источника по URI, указываемому в командной строке. Следует, однако, иметь в виду, что cookie-наборы используются не на всех веб-сайтах, поэтому нужно еще найти такой веб-сайт, который поддерживает cookie-наборы.

/* Пример проверки cookie-наборов.
Для того чтобы проверить, какие именно cookie-наборы используются на веб-сайте, укажите его имя в командной строке.
Так, если назвать эту программу CookieDemo, то по команде
CookieDemo http://msn.com
отобразятся cookie-наборы с веб-сайта по адресу www.msn.com. */
using System;
using System.Net;
class CookieDemo {
  static void Main(string[] args) {
    if (args.Length != 1) {
      Console.WriteLine("Применение: CookieDemo <uri>");
      return;
    }
    // Создать объект запроса типа WebRequest по указанному URI.
    HttpWebRequest req = (HttpWebRequest)
              WebRequest.Create(args[0]);
    // Получить пустой контейнер.
    req.CookieContainer = new CookieContainer();
    // Отправить сформированный запрос и получить на него ответ.
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
    // Отобразить cookie-наборы.
    Console.WriteLine("Количество cookie-наборов: " +
            resp.Cookies.Count);
    Console.WriteLine("{0,-20}{1}", "Имя", "Значение");
    for (int i = 0; i < resp.Cookies.Count; i++)
      Console.WriteLine("{0, -20}{1}",
                         resp.Cookies[i].Name,
                         resp.Cookies[i].Value);
    // Закрыть ответный поток,
    resp.Close();
  }
}

Применение свойства LastModified

Иногда требуется знать, когда именно сетевой ресурс был обновлен в последний раз. Это нетрудно сделать, пользуясь сетевыми средствами класса HttpWebResponse, среди которых определено свойство LastModified, приведенное ниже.

public DateTime LastModified { get; }

С помощью свойства LastModified получается время обновления содержимого сетевого ресурса в последний раз.

В приведенном ниже примере программы отображаются дата и время, когда был в последний раз обновлен ресурс, указываемый по URI в командной строке.

/* Использовать свойство LastModified.
Для того чтобы проверить дату последнего обновления веб-сайта, введите его URI в командной строке. Так, если назвать эту программу LastModifiedDemo, то для проверки даты последней модификации веб-сайта по адресу www.HerbSchildt.com введите команду
LastModif iedDemo http: //HerbSchildt. com
*/
using System;
using System.Net;
class LastModifiedDemo {
  static void Main(string[] args) {
    if (args.Length != 1) {
      Console.WriteLine("Применение: LastModifiedDemo <uri>"); return;
    }
    HttpWebRequest req = (HttpWebRequest)
    WebRequest.Create(args[0]);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
    Console.WriteLine("Последняя модификация: " + resp.LastModified);
    resp.Close();
  }
}

Оглавление книги


Генерация: 1.383. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз