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()
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
Как только будет выяснена причина ошибки, в программе могут быть предприняты соответствующие действия.