Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 187
Текст из файла (страница 187)
А исключение 10Ехсерг1оп, конечно, генерируется при ошибке чтения из потока, в зависимости от того, как организован ввод данных. Обработка исключений В приведенном виже примере программы демонстрируется обработка всевозможных сетевых исключений, которые могут возникнуть в связи с выполнением программы из предыдущего примера, в которую теперь добавлены соответствующие обработчики исклточеиий. // Пример обработки сетевых исключений.
ся1лс Буясекч ия1лс Буягеи.пегт Сасвексггувоггослб Кеера11чега11оге Репбапч Ргохунаиепеяо1сс1осга11нге Ргогосо1Еггог Весоеягсапсе1еб БессгеСЬалле1Га11нге Боссеяя ЦпкпоипЕггог Глава 2о. Сетевые средства подключения к Интернету 927 цз1пЗ Яузсеш.тбт с1азз ИеГЕхсбешо ( зсасас но1б Ма1п() ( зпс снт ггу ( // Сначала создать объект запроса типа ИеЬКеццезс по указанному ОК1. Нссрнепает)цезс гец = (НГГрнеЬКек)цезс) ИеЬКеццезГ.Сгеасе("Ьсср://ннн.мсбгам-Н111.сош"); // Затем отправить сформированный запрос и получить на него ответ. НссрнеЬКезропзе гезр (НссрИеЬКезропзе) геп.аегкезропзе М; // Получить из ответа поток ввода. Ясгеаш 1зсгш = гезр.ОеснезропзеЯГгеаш() /* А теперь прочитать и отобразить гипертекстовое содержимое, полученное по указанному ОК1.
Это солержимое выводится на экран отдельными порциями по 400 символов. После каждой такой порции следует нажать клавишу <ЕНТЕК>, чтобы вывести на экран следующую порцию, состоящую из 400 символов. */ тот(апг 1=14; 1+4) ( сп = 1зсгш. КеабНусе () ) те(сп == -1) Ьгеант Сопзо1е.Итаке ((сваг) сп) т 11((1%400)= О) ( сопзо1е.иг1ге("1пнажмите клавишу <епгег>.")т Сопзо1е.неаб11пе()т ) ) // Закрыть ответный поток. При этом закрывается // также поток ввода 1вггш. гезр.С1озе(); ) сассп(ИеЬЕхсерсаоп ехс) ( Сопзо1е.ыгасетапе("Сетевая ошибка: ехс.меззаде + "1пкод состояния: " + ехс.агагцз)) ) сассп(ргососо101о1ас1опЕхсерсаоп ехс) ( Сопзо1е.ыг1сеЕЕпе("Протокольная ошибка: " 4 ехс.мазза)те)т ) сассп(ОгатогшаГЕхсерсаоп ехс) ( Сопзо1е.ыг1се11пе("Ошибка Формата ОК1: " ч ехс.меззаое)т ) сагсь(ногяцрроггебехсергаоп ехс), ( сопзо1е.иг1ге11пе("неизвестный протокол.
"" + ехс.меззаде]т ) сассп(1ОЕхсерсаоп ехс) ( сопзо1е.игагетвпе("Ошибка ввода-вывода: " + ехс.Незвале)) ) сассп(Яузсеш.аесцгасу.Яесцгасуахсерсаоп ехс) ( Сопзо1е.ыгасе11пе("Исключение в связи с " + "нарушением безопасности: " + ехс.Меззаде)т 928 часть )). Библиотека Сз ) сагой(1пта11борегасгопЕхсерс1оп ехс) ( Сопяо1е.игъсеъгпе (" Недопустимая операция: " т ехс.иеязаое) т ) ) ) Теперь перехватываются все исключения, которые могут быть сгенерированы сетевыми методами. Так, если изменить вызов метода сгеасе () следующим образом: неопеццезс.сгеаге("атер://инн.испгаи-и111.сош/шоопгоскес")т а затем перекомпилировать и еще раз выполнить программу, то получится приведенный ниже результат.
Сетевая ошибка: Удаленный сервер возвратил ошибку: (404) Не найден. Код состояния: Ргососо1Еггог На веб-сайте по адресу нны.мсегаи-н111.сош отсутствует раздел шоопгоскес, и поэтому он не найден по указанному 1)В1, что и подтверждает приведенный выше результат. Ради краткости и ясности в программах большинства примеров из этой главы отсутствует полноценная обработка исключений.
Но в реальных приложениях она просто необходима. КЛаСС Огх Как следует из табл. 25.1, метод неЬпес(цезс. Сгеаге () существует в двух вариантах. В одном варианте он принимает идентификатор 1)К1 в виде строки. Именно этот вариант и был использован в предыдущих примерах программ. А во втором варианте этот метод принимает идентификатор 11К1 в виде экземпляра объекта класса цгъ, определенного в пространстве имен Еуз геш.
Класс ()г1 инкапсулирует идентификатор 1)К1. Используя класс цг1, можно сформировать 1)К1, чтобы затем передать этот идентификатор методу сгеаге () . Кроме того, идентификатор 1)21 можно разделить на части. Для выполнения многих простых операций в Интернете класс цг1 малопригоден.
Тем не менее он может оказаться весьма полезным в более сложных ситуациях сетевого подключения к Интернету. В классе иг1 определяется несколько конструкторов. Ниже приведены наиболее употребительные конструкторы этого класса. рцьгьс Пгь(зкг1по пгх) рцв11с Пгг(цг1 Ьазе, лсг1пс ге1) В первой форме конструктора объект класса цг1 создается по идентификатору 1Ж1, заданному в виде строки. А во второй форме конструктора он создается по относительному 1)К1, заданному в виде строки ге1 относительно абсолютного 11К!, обозначаемого в виде объекта Ьаэе типа цг1.
Абсолютный 1)21 определяет полный адрес 1)К1, а относительный 1)К1 — только путь к искомому ресурсу. В классе цгъ определяются многие поля, свойства и методы, оказывающие помощь в управлении идентификаторами 1)К1 или в получении доступа к различным частям (1В1. Особый интерес представляют приведенные ниже свойства. Глава 25, Сетевые средстаа подключения к Интернету 929 Свойство Описание риЬ1гс яггтпд Нояг ( сегг ) рсптгс ягггпд Ьоса1Рагп ( дег," ) Получает имя сервера Получает локальный путь к файлу Риьтгс ясгтпз РяськппПпегу ( зесг ) получает абсолютный путь и строку запроса риЬ11с гпг Рогг ( сегг ) Получает номер порта для указанного протокола.
Так, для протокола НТТР номер порта равен 80 риЬ1гс зггтпд ()ыегу ( Пег) ) роЬ11с ягг1пд Яспеве ( сегг ) Получает строку запроса Получает протокол Перечисленные выше свойства полезны для разделения 1321 на составные части. Применение этих свойств демонстрируется в приведенном ниже примере программы. // Пример применения свойств из класса Пг1. пяспс Яуягепи мясом Яуясев.нес; с1аяя Пггрево ( ясясгс тога иягп() ( Пгг яявр1е = пеы Пгг("ЬССР://Негпзспггг(г.сов/яовеГ11е.гхгтзовейоегу")г Сопяо1е.игггеЬгпе("Хост: " + яавр1е.иояг); Сопяо1е.ыгггеЬгпе("Порт: " Ь яявр1е.РогС); Сопяо1е.игггеьапе("Протокол: " + завр1е.ясЬеве); Сопяо1е.игггеьтпе("Локальный путь: " + яавр1е.ьоса1Рагп)) Сопяо1е.ыгггеЬЬпе("Запрос: ." + яавр1е.()иегу)г сопяо1е.нггсеььпе("путь и запрос: " ь яавр1е.уасьапг(Пиесу)) ) ) Эта программа дает следующий результат: Хост: Негпзсп11г(г.сов Порт: ЗО Протокол: ЬССР Локальный путь: /яовет11е.гхг Запрос: Рзовейоегу Путь и запрос: /яовет11е.гхгтзовейоегу Доступ к дополнительной информации, получаемой в ответ по протоколу НТТР С помон(ью сетевых средств, имеющихся в классе нссрнеЬке зропяе, можно получить доступ к другой информации, помимо содержимого указываемого ресурса К этой информации, в частности, относится время последней модификации ресурса, а также имя серве)хс Она оказывается доступной с помощью различных свойств, связанных с получаемым ответом.
Все эти свойства, включая и те что, определены в классе иеьпеяропзе, сведены в табл. 25.5. В приведенных далее примерах прогрзмм демонстрируется применение этих свойств на практике. 930 Часть й. Библиотека С» Таблица 25.5. Свойства, определанна(в в классе нссрзтенаевропве Описание Получает название используемого набора символов Получает название схемы кодирования Получает описание содержимого роЬ11с Оагетсие Г,аягнос(111ес( ( цесг ) Получает время последней модификации ресурса Получает строку, которая задает способ ответа РоЬ1»с уегя»оп Ргагосо1оегясоп ( цесг Получает строку, обозначающую имя сервера риЫгс НССРЯСагоясоае Ясасоясог(е ( цесг роЫ»с ясггпц Получает строку, обозначающую состояние транзакции в удобоясасояоеясг1рс1оп ( цесг ) читаемой форме Доступ к заголовку Для доступа к заголовку с информацией, получаемой в ответ по протоколу НТТР служит свойство Неас(егя, определенное в классе НССрнеЬНеяропяе: риЬ»»с ИеЬНеаг(егсо11ессгоп Неаг(егя( цегг роЬ1гс ягггпц СЬагасСегЯеС ( цес; ) роЫ1с ягг1пц СопгепСЕпсог(1пц ( цеСГ ) рпЫгс 1опц СопгепСЬепцСЬ ( цес; ) роЫгс яггкпц Сопгепгтуре ( цесг ) рпЫгс СооКкеСо11есС1оп СооКгея ( цесг яесг ) роЫгс ХеЬНеааегСо11есггоп Неаг(егя( цег; ) рпЬ»тс Ьоо1 1яугоесаспе ( цес; ) роЫ1с Ьоо1 1яногпа11улоСЬепС»сагеа ( цес; ) риЬ11с яСггпц Мегпос( ( цес; ) риЫ»с Цг» Веропяепгг ( цесг ) роЫгс ясгспц Яегтег ( цес; ) Получает длину принимаемого содержимого.
Если она недоступна, свойство имеет значение -! Получает или устанавливает список соойе-наборов, присоединяе- мых к ответу Получает коллекцию заголовков, присоединяемых к стеву Иыеет логическое значение стае, если запрос получен из каша. А если запрос доставлен по сети, то имеет логическое значение та1яе Имеет логическое значение сгое, если клиент и сервер опозна- ют друг друга, в противном случае — имеет логическое значение га1яе Получает обьект типа нега гоп, описывающий версию протокола НТТР используемую в транзакции Получает () Н(, по которому был сформирован ответ.
Этот иденти- фикатор может отличаться от запрашиваемого, если ответ был перещзюсован по дРугому ()Н! получает обьекг типа нссрясасаясоае, описываюц(ий состояние транзакции Глава 25. Сетевые средства подключении к Интернету 931 // Проверить заголовки. паапа Зузгеит изьпд Зузкет.пест с1азз Неабегпеио ( згаггс чога Маго() ( // Создать обьект запроса типа ИеЬкеяиезс по укаэанному ПВТ. Нсгриеьаеяпезс геЧ = (Ньгриеьаеяпезс) Иеькеяпезс.сгеасе("Ьсгрк//ннн.исбган-п111.сои")т // Отправить сформированный запрос и получить на него ответ. НссриеЬНезропзе гезр = (НссриеЬНезропзе) гея.пегвезропзе(); // Получить список имен. зсгтпд[) навез = гезр.пеабегз.а11хеуз) // Отобразить пары "имя-значение" иэ заголовка.
Сопзо1е.игтсе11пе("(0,-20)(1)1п", "Имя", "Значение" ); тогеасЬ(зггьпч и Тп навез) ( Сопзо1е .Игтсе (" ( О, -20 ) ", и) т гогеась(зггтпч ч Тп гезр.неабегз.песча1пез(п)) Сопзо1е.ЙгтгеЬ1пе(ч)т // Закрыть ответный поток. гезр.С1озе()т ) Ниже приведен полученный результат. Не следует забывать, что информация в заголовке периодически меняется, поэтому у вас результат может оказаться несколько иным. Имя Тгапзтег-епсобьпс Сопсепг-Туре Пате Зегчег Значение сЬппнеб Гехт/Ьси1 Ггь, 27 дпп 2008 20:32:06 6МТ Зип-ОИЕ-ИеЬ-Зегчег/6.1 Заголовок протокола Н'ГГР состоит из пар "имя — значение", представленных строками. Каждая пара "имя-зиачеиие" хранится в коллекции класса ИеЬНеаг(егСО11есС1оп.