Как избежать WebException для ответа 403 Forbidden?

У меня есть приложение, которое иногда должно делать некоторые запросы к серверу, чтобы убедиться, что эти запросы правильно заблокированы. Другими словами, ожидаемый ответ сервера - 403 Запрещено.

С таким фрагментом кода:

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(protectedPage);
httpRequest.Method = WebRequestMethods.Http.Head;
WebResponse response = HttpRequest.GetResponse();

в последней строке добавляется WebException.

При профилировании кода это исключение в блоке try / catch влияет на производительность, чего я хочу избежать.

Есть ли способ проверить ответ сервера, ожидая 403, без необходимости перехватывать исключение (но избегая прямого использования сокетов)?


person Arseni Mourzenko    schedule 05.12.2010    source источник
comment
Я не понимаю, как перехват этого исключения вообще повлияет на производительность. Я имею в виду, что это ничего не стоит по сравнению с тем, сколько времени нужно, чтобы получить веб-страницу.   -  person Will    schedule 05.12.2010


Ответы (2)


К сожалению, это досадное исключение. во фреймворке, и избежать этого невозможно (при использовании класса HttpWebRequest). Но, как указал Хай, эта обработка исключений займет наносекунды, в то время как сам веб-запрос займет миллисекунды (в лучшем случае), поэтому не беспокойтесь об этом.

Объект WebException имеет свойство Response, которое содержит ответ; когда вы обрабатываете исключение, важно удалить этот объект WebResponse (чтобы избежать утечки соединений).

person Bradley Grainger    schedule 05.12.2010
comment
@Tergiver, я думаю, это ситуация, когда неприятное исключение одного варианта использования является экзогенным исключением другого варианта использования. File.Open выдает ошибку, если у вас нет разрешения на чтение файла, HttpWebRequest здесь делает то же самое. - person Jeffrey Hantin; 29.08.2014

То, что требует времени при профилировании, - это, вероятно, не часть отлова исключений, а фактический ответ веб-сайта.

Свойство WebException.Status предоставит вам код состояния для ответа HTTP, и вы сможете выполнять дальнейшую обработку на его основе.

person Can Gencer    schedule 05.12.2010
comment
WebException.Status просто указывает на ошибку протокола. Он не дает кода статуса. - person David Winant; 11.07.2012
comment
Вы должны вызвать исключение. Ответить на HttpWebResponse и проверить свойство response.StatusCode. - person Can Gencer; 11.07.2012
comment
Спасибо, ((HttpWebResponse) (we.Response)). StatusCode дает значение, как вы сказали. - person David Winant; 11.07.2012