Страница 491 из 502
<b>// Сначала создать объект запроса типа WebRequest по указанному URI.</b>
<b>WebRequest req = WebRequest.Create("http://www.McGraw-Hill.com");</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, конечно, генерируется при ошибке чтения из потока, в зависимости от того, как организован ввод данных.