Добавить в цитаты Настройки чтения

Страница 491 из 502

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

<b>WebRequest req = WebRequest.Create(&quot;http://www.McGraw-Hill.com&quot;);</b>

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

<b>WebResponse resp = req.GetResponse() ;</b>

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

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

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

Метод Create(), определенный в классе WebRequest, может генерировать четыре исключения. Так, если протокол, указываемый в префиксе URI, не поддерживается, то генерируется исключение NotSupportedException. Если формат URI оказывается недействительным, то генерируется исключение UriFormatException. А если у пользователя нет соответствующих полномочий для доступа к запрашиваемому сетевому ресурсу, то генерируется исключение System.Security.SecurityException. Кроме того, метод Create() генерирует исключение ArgumentNullException, если он вызывается с пустой ссылкой, хотя этот вид ошибки не имеет непосредственного отношения к сетевому подключению.

При вызове метода GetResponse() для получения ответа по протоколу HTTP может произойти целый ряд ошибок. Эти ошибки представлены следующими исключениями: InvalidOperationException, ProtocolViolationException, NotSupportedException и WebException. Наибольший интерес среди них вызывает исключение WebException.

У исключения WebException имеются два свойства, связанных с сетевыми ошибками: Response и Status. С помощью свойства Response можно получить ссылку на объект типа WebResponse в обработчике исключений. Для соединения по протоколу HTTP этот объект описывает характер возникшей ошибки. Свойство Response объявляется следующим образом.

<b>public WebResponse Response { get; }</b>

Когда возникает ошибка, то с помощью свойства Status типа WebException можно выяснить, что именно произошло. Это свойство объявляется следующим образом:

<b>public WebExceptionStatus Status {get; }</b>

где WebExceptionStatus — это перечисление, которое содержит приведенные ниже значения.

<b>CacheEntryNotFound</b>

<b>Co

<b>Co

<b>KeepAliveFailure</b>

<b>MessageLengthLimitExceeded</b>

<b>NameResolutionFailure</b>

<b>Pending</b>

<b>PipelineFailure</b>

<b>ProtocolError</b>

<b>ProxyNameResolutionFailure</b>

<b>ReceiveFailure</b>

<b>RequestCanceled</b>

<b>RequestProhibitedByCachePolicy</b>

<b>RequestProhibitedByProxy</b>

<b>SecureCha

<b>SendFailure</b>

<b>ServerProtocolViolation</b>

<b>Success</b>

<b>Timeout</b>

<b>TrustFailure</b>

<b>UnknownError</b>

Как только будет выяснена причина ошибки, в программе могут быть предприняты соответствующие действия.

Для соединения по протоколу HTTP метод GetResponseStream() из класса WebResponse может сгенерировать исключение ProtocolViolationException, которое в целом означает, что в работе по указанному протоколу произошла ошибка. Что же касается метода GetResponseStream(), то это означает, что ни один из действительных ответных потоков недоступен. Исключение ObjectDisposedException генерируется в том случае, если ответ уже утилизирован. А исключение IOException, конечно, генерируется при ошибке чтения из потока, в зависимости от того, как организован ввод данных.