WebResponse resp = req.GetResponse() ;
В тех случаях, когда не требуется приведение к конкретному типу реализации протокола, лучше пользоваться классами 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
объявляется следующим образом.
public WebResponse Response { get; }
Когда возникает ошибка, то с помощью свойства Status
типа WebException
можно выяснить, что именно произошло. Это свойство объявляется следующим образом:
public WebExceptionStatus Status {get; }
где WebExceptionStatus
— это перечисление, которое содержит приведенные ниже значения.
CacheEntryNotFound
ConnectFailure
ConnectionClosed
KeepAliveFailure
MessageLengthLimitExceeded
NameResolutionFailure
Pending
PipelineFailure
ProtocolError
ProxyNameResolutionFailure
ReceiveFailure
RequestCanceled
RequestProhibitedByCachePolicy
RequestProhibitedByProxy
SecureChannelFailure
SendFailure
ServerProtocolViolation
Success
Timeout
TrustFailure
UnknownError
Как только будет выяснена причина ошибки, в программе могут быть предприняты соответствующие действия.