Public virtual Stream GetResponseStream()



Возвращает поток ввода, связанный с запрашиваемым URI. Из этого потока могут быть введены данные из запрашиваемого URI

 

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

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

 

public virtual long ContentLength { get; set; } -  Получает или устанавливает длину принимаемого содержимого. Устанавливается равным -1, если данные о длине содержимого недоступны

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

public virtual WebHeaderCollection Headers { get; } -  Получает или устанавливает коллекцию заголовков, связанных с URI

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

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

public virtual Uri - Получает URI, по которому был сформирован ответ.

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

 

 

Классы HttpWebRequest и HttpWebResponse

 

Оба класса, HttpWebRequest и HttpWebResponse, наследуют от классов WebRequest и WebResponse и реализуют протокол HTTP. В ходе этого процесса в обоих классах вводится ряд дополнительных свойств, предоставляющих подробные сведения о транзакции по протоколу HTTP. О некоторых из этих свойств речь пойдет далее в настоящей главе. Но для выполнения простых операций в Интернете эти дополнительные свойства, как правило, не требуются.

 

 

Первый простой пример

 

Доступ к Интернету организуется на основе классов WebRequest и WebResponse. Поэтому, прежде чем рассматривать этот процесс более подробно, было бы полезно обратиться к прострму примеру, демонстрирующему порядок доступа к Интернету по принципу запроса и ответа. Глядя на то, как эти классы применяются на практике, легче понять, почему они организованы именно так, а не как-то иначе.

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

 

// Пример доступа к веб-сайту.

using System;

using System.Net;

using System.IO;

class NetDemo {

static void Main() {

int ch;

 

Сначала создать объект запроса типа WebRequest по указанному URI.

HttpWebRequest req = (HttpWebRequest)

WebRequest.Create(http://www.McGraw-Hill.com);

 

Затем отправить сформированный запрос и получить на него ответ.

HttpWebResponse resp = (HttpWebResponse) req.GetResponse();

 

Получить из ответа поток ввода.

Stream istrm = resp.GetResponseStream();

/* А теперь прочитать и отобразить гипертекстовое содержимое, полученное по указанному URI. Это содержимое выводится на экран отдельными порциями по 400 символов. После каждой такой порции следует нажать клавишу <ENTER>,чтобы вывести на экран следующую порцию из 400 символов. */

for (int i = 1; ; i++) {

ch = istrm.ReadByte();

 

if (ch == -1) break;

Console.Write((char)ch);

 

if ((i % 400)== 0) {

Console.Write("\nНажмите клавишу <Enter>.");

Console.ReadLine();

}

}

Закрыть ответный поток. При этом закрывается также поток ввода istrm.

resp.Close();

}

}

 

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

 

<html>

<head>

<title>Home - The McGraw-Hill Companies</title>

<meta name="keywords" content="McGraw-Hill Companies,McGraw-Hill, McGraw Hill, Aviation Week, BusinessWeek, Standard and Poor's, Standard & Poor1s,CTB/McGraw-Hill,Glencoe/McGraw-Hill, The Grow Network/McGraw-Hill,Macmillan/McGraw-Hill, McGraw-Hill Contemporary,McGraw-Hill Digital Learning,McGraw-Hill Professional Development,SRA/McGraw

Нажмите клавишу <Enter>.

-Hill,Wright «Group/McGraw-Hill,McGraw-Hill Higher Education,McGraw-Hill/Irwin, McGraw-Hill/Primis Custom Publishing,McGraw-Hill/Ryerson,Tata/McGraw-Hill,

McGraw-Hill Interamericana,Open University Press, Healthcare Information Group, Platts, McGraw-Hill Construction, Information & Media Services" />

<meta name="description" content="The McGraw-Hill Companies Corporate Website." /> <meta http-equiv

Нажмите клавишу <Enter>.

 

Итак, выше приведена часть гипертекстового содержимого, полученного из вебсайта издательства McGraw-Hill по адресу www.McGraw-Hill. com. В рассматриваемом здесь примере программы это содержимое просто выводится в исходном виде на экран посимвольно и не форматируется в удобочитаемом виде, как это обычно делается в окне браузера.

Проанализируем данную программу построчно. Прежде всего обратите внимание на использование в ней пространства имен System.Net. Как пояснялось ранее, в этом пространстве имен находятся классы сетевого подключения к Интернету. Обратите также внимание на то, что в данную программу включено пространство имен System.IO, которое требуется для того, чтобы прочитать полученную на веб-сайте информацию, используя объект типа Stream.

В начале программы создается объект типа WebRequest, содержащий требуемый URL Как видите, для этой цели используется метод Create(), а не конструктор. Это статический член класса WebRequest. Несмотря на то что класс WebRequest является абстрактным, это обстоятельство не мешает вызывать статический метод данного класса. Метод Create() возвращает объект типа HttpWebRequest. Разумеется, его значение требуется привести к типу HttpWebRequest, прежде чем присвоить его переменной req ссылки на объект типа HttpWebRequest. На этом формирование запроса завершается, но его еще нужно отправить по указанному URL

Для того чтобы отправить запрос, в рассматриваемой здесь программе вызывается метод GetResponse() для объекта типа WebRequest. Отправив запрос, метод GetResponse() переходит в состояние ожидания ответа. Как только ответ будет получен, метод GetResponse() возвратит объект типа WebResponse, в котором инкапсулирован ответ. Этот объект присваивается переменной resp. Но в данном случае ответ принимается по протоколу HTTP, и поэтому полученный результат приводится к типу HttpWebResponse. Среди прочего в ответе содержится поток, предназначаемый для чтения данных из источника по указанному URL

Далее поток ввода получается в результате вызова метода GetResponseStream() для объекта resp. Это стандартный объект класса Stream со всеми атрибутами и средствами, необходимыми для организации потока ввода. Ссылка на этот поток присваивается переменной istrm, с помощью которой данные могут быть прочитаны из источника по указанному URI, как из обычного файла.

После этого в программе выполняется чтение данных из веб-сайта издательства McGraw-Hill по адресу www .McGraw-Hill. com и последующий их вывод на экран. А поскольку этих данных много, то они выводятся на экран отдельными порциями по 400 символов, после чего в программе ожидается нажатие клавиши <Enter>, чтобы продолжить вывод. Благодаря этому выводимые данные можно просматривать без прокрутки экрана. Обратите внимание на то, что данные читаются посимвольно с помощью метода ReadByte(). Напомним, что этот метод возвращает очередной байт из потока ввода в виде значения типа int, которое требуется привести к типу char. По достижении конца потока этот метод возвращает значение -1.

И наконец, ответный поток закрывается при вызове метода Close() для объекта resp. Вместе с ответным потоком автоматически закрывается и поток ввода. Ответный поток следует закрывать в промежутках между последовательными запросами. В противном случае сетевые ресурсы могут быть исчерпаны, препятствуя очередному подключению к Интернету.

И в заключение анализа рассматриваемого здесь примера следует обратить особое внимание на следующее: для отображения гипертекстового содержимого, получаемого от сервера, совсем не обязательно использовать объект типа HttpWebRequest или HttpWebResponse. Ведь для решения этой задачи в данной программе оказалось достаточно стандартных методов, определенных в классах WebRequest и WebResponse, и не потребовалось прибегать к специальным средствам протокола HTTP. Следовательно, вызовы методов Create() и GetResponse() можно было бы написать следующим образом.

 

// Сначала создать объект запроса типа WebRequest по указанному URI.

WebRequest req = WebRequest.Create("http://www.McGraw-Hill.com");

// Затем отправить сформированный запрос и получить на него ответ.

WebResponse resp = req.GetResponse() ;

 

В тех случаях, когда не требуется приведение к конкретному типу реализации протокола, лучше пользоваться классами WebRequest и WebResponse, так как это дает возможность менять протокол, не оказывая никакого влияния на код программы. Но поскольку во всех примерах, приведенных в этой главе, используется протокол HTTP, то в ряде примеров демонстрируются специальные средства этого протокола из классов HttpWebRequest и HttpWebResponse.

 

 

Обработка сетевых ошибок

 

Программа из предыдущего примера составлена верно, но она совсем не защищена от простейших сетевых ошибок, которые способны преждевременно прервать ее выполнение. Конечно, для программы, служащей в качестве примера, это не так важно, как для реальных приложений. Для полноценной обработки сетевых исключений, которые могут быть сгенерированы программой, необходимо организовать контроль вызовов методов Create(), GetResponse() и GetResponseStream(). Следует особо подчеркнуть, что генерирование конкретных исключений зависит от используемого протокола. И ниже речь пойдет об ошибках, которые могут возникнуть при использовании протокола HTTP, поскольку средства сетевого подключения к Интернету, доступные в С#, рассматриваются в настоящей главе на примере именно этого протокола.

 

 


Дата добавления: 2019-02-12; просмотров: 251; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!