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

Класс Uri

Как следует из табл. 26.1, метод WebRequest. Create () существует в двух вариантах. В одном варианте он принимает идентификатор URI в виде строки. Именно этот вариант и был использован в предьтдугцих примерах программ. А во втором варианте этот метод принимает идентификатор URI в виде экземпляра объекта класса Uri, определенного в пространстве имен System. Класс Uri инкапсулирует идентификатор URL Используя класс Uri, можно сформировать URI, чтобы затем передать этот идентификатор методу Create () . Кроме того, идентификатор URI можно разделить на части. Для выполнения многих простых операций в Интернете класс Uri малопригоден. Тем не менее он может оказаться весьма полезным в более сложных ситуациях сетевого подключения к Интернету.

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

public Uri(string uriString)

public Uri(Uri baseUri, string relativeUri)

В первой форме конструктора объект класса Uri создается по идентификатору URI, заданному в виде строки uriString. А во второй форме конструктора он создается по относительному URI, заданному в виде строки relativeUri относительно абсолютного URI, обозначаемого в виде объекта baseUri типа Uri. Абсолютный URI определяет полный адрес URI, а относительный URI — только путь к искомому ресурсу.

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

 

Свойство

 

Описание

 

Public

 

string Host { get; }

 

Получает имя сервера

 

Public

 

string LocalPath { get; }

 

Получает локальный путь к файлу

 

Public

 

string. PathAndQuery { get; }

 

Получает абсолютный путь и строку запроса

 

Public

 

int Port { get; }

 

Получает номер порта для указанного протокола. Так, для протокола HTTP номер порта равен 80

 

Public

 

string Query { get; }

 

Получает строку запроса

 

Public

 

string Scheme { get; }

 

Получает протокол

 

Перечисленные выше свойства полезны для разделения URI на составные части. Применение этих свойств демонстрируется в приведенном ниже примере программы.

// Пример применения свойств из класса Uri.

Using System; using System.Net;

class UriDemo {

static void Main() {

Uri sample = new Uri(" http://HerbSchildt.com/somefile.txt?SomeQuery ");

Console.WriteLine("Хост: " + sample.Host);

Console.WriteLine("Порт: " + sample.Port);

Console.WriteLine("Протокол: " + sample.Scheme);

Console .WriteLine ("Локальный путь: 11 + sample. LocalPath) ;

Console.WriteLine("Запрос: " + sample.Query);

Console.WriteLine("Путь и запрос: " + sample.PathAndQuery);

}

}

Эта программа дает следующий результат.

Хост: HerbSchildt.com Порт: 80 Протокол: http

Локальный путь: /somefile.txt Запрос: ?SomeQuery

Путь и запрос: /somefile.txt?SomeQuery

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

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

 

Свойство

 

Описание

 

Public

 

string CharacterSet { get; }

 

Получает название используемого набора символов

 

public { get;

 

string ContentEncoding }

 

Получает название схемы кодирования

 

Public

 

long ContentLength { get; }

 

Получает длину принимаемого содержимого. Если она недоступна, свойство имеет значение -1

 

Public

 

string ContentType { get; }

 

Получает описание содержимого

 

Public

 

CookieCollection Cookies

 

Получает или устанавливает список cookie-

 

{ get;

 

set; }

 

наборов, присоединяемых к ответу

 

Public

 

WebHeaderCollection

 

Получает коллекцию заголовков, присоединяе

 

Headers! get; }

 

мых к ответу

 

Public

 

bool IsFromCache { get; }

 

Принимает логическое значение true, если запрос получен из кеша. А если запрос доставлен по сети, то принимает логическое значение false

 

Public

 

Bool

 

Принимает логическое значение true, если

 

IsMutuallyAuthenticated { get; }

 

клиент и сервер опознают друг друга, а иначе — принимает логическое значение false

 

public DateTime LastModified { get; }

 

Получает время последней модификации ресурса

 

Public

 

string Method { get; }

 

Получает строку, которая задает способ ответа

 

Public

 

Version ProtocolVersion

 

Получает объект типа Version, описываю

 

{ get;

 

}

 

щий версию протокола HTTP, используемую в транзакции

 

Public

 

Uri ReponseUri { get; }

 

Получает URI, по которому был сформирован ответ. Этот идентификатор может отличаться от запрашиваемого, если ответ был переадресован по другому URI

 

Public

 

string Server { get; }

 

Получает строку, обозначающую имя сервера

 

Public

 

HttpStatusCode StatusCode

 

Получает объект типа HttpStatusCode, опи

 

{ get;

 

}

 

сывающий состояние транзакции

 

Public

 

String StatusDescription

 

Получает строку, обозначающую состояние

 

{ get;

 

}

 

транзакции в удобочитаемой форме

 

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

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

public WebHeaderCollection Headers{ get; }

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