Нажмите клавишу
Итак, выше приведена часть гипертекстового содержимого, полученного из вебсайта издательства 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 символов, после чего в программе ожидается нажатие клавиши ReadByte()
. Напомним, что этот метод возвращает очередной байт из потока ввода в виде значения типа int
, которое требуется привести к типу char
. По достижении конца потока этот метод возвращает значение -1.
И наконец, ответный поток закрывается при вызове метода Close()
для объекта resp
. Вместе с ответным потоком автоматически закрывается и поток ввода. Ответный поток следует закрывать в промежутках между последовательными запросами. В противном случае сетевые ресурсы могут быть исчерпаны, препятствуя очередному подключению к Интернету.
И в заключение анализа рассматриваемого здесь примера следует обратить особое внимание на следующее: для отображения гипертекстового содержимого, получаемого от сервера, совсем не обязательно использовать объект типа HttpWebRequest
или HttpWebResponse
. Ведь для решения этой задачи в данной программе оказалось достаточно стандартных методов, определенных в классах WebRequest
и WebResponse
, и не потребовалось прибегать к специальным средствам протокола HTTP. Следовательно, вызовы методов Create()
и GetResponse()
можно было бы написать следующим образом.
// Сначала создать объект запроса типа WebRequest по указанному URI.
WebRequest req = WebRequest.Create("http://www.McGraw-Hill.com");
// Затем отправить сформированный запрос и получить на него ответ.