Как остановить .Net HttpWebRequest.GetResponse (), вызывающий исключение - PullRequest
13 голосов
/ 24 апреля 2010

Конечно, конечно, конечно, есть способ настроить объект .Net HttpWebRequest, чтобы он не вызывал исключение при вызове HttpWebRequest.GetResponse () и возвращении любых 300 или 400 кодов состояния?

Джон Скит так не думает , поэтому я почти не смею даже спрашивать, но мне трудно поверить, что нет никакого пути к этому. Коды ответа 300 и 400 являются действительными ответами при определенных обстоятельствах. Почему мы всегда вынуждены нести исключение?

Возможно, есть какой-то неясный параметр конфигурации, который ускользнул от Джона Скита? Возможно, существует совершенно другой тип объекта запроса, который не может использоваться таким образом?

(и да, я знаю, что вы можете просто поймать исключение и получить от него ответ, но я бы хотел найти способ не делать этого).

Спасибо за любую помощь

Ответы [ 4 ]

12 голосов
/ 13 июля 2011

Если вы хотите получить ответ об ошибке 4xx, вы можете сделать это следующим образом:

HttpWebResponse res = null;
string response = string.Empty;
StreamReader sr = null;
Stream resst = null;
try
{
    res = (HttpWebResponse)req.GetResponse();
    resst = res.GetResponseStream();
    sr = new StreamReader(resst);
    response = sr.ReadToEnd();
}
catch (WebException exception)
{
    HttpWebResponse errorResponse = (HttpWebResponse)exception.Response;
    resst = errorResponse.GetResponseStream();
    sr = new StreamReader(resst);
    response = sr.ReadToEnd();
}
this.Response.Write(response);

Надеюсь, это поможет ...

5 голосов
/ 20 января 2013

Лучший ответ:

Исправление желания WebRequest выдавать исключения вместо возврата статуса

WayBack Машинный архив: http://fearthecowboy.com/2011/09/02/fixing-webrequests-desire-to-throw-exceptions-instead-of-returning-status/

5 голосов
/ 24 апреля 2010

Согласно спецификации, когда сервер отправляет код состояния 400, это означает, что:

Запрос не может быть понят сервер из-за неправильного синтаксиса. Клиент не должен повторять запрос без изменений.

Так что в данном случае вполне естественно иметь исключение. Что касается 300 обеспокоен, что является более спорным.

В любом случае, если вам нужно какое-то нестандартное поведение, вы всегда можете прибегнуть к TcpClient , но это действительно кажется крайней и отчаянной мерой.

Вы проводили тесты производительности? Подтвердили ли вы, что создание исключения в этом исключительном случае является узким местом для вашего приложения? В этом случае похоже на микрооптимизацию. Разве вы не можете сделать этот веб-сервер счастливым, подделав правильный запрос и получив 200 в конце? Если нет, то не можете ли вы перейти на более стандартный веб-сервер?

1 голос
/ 16 июня 2011

Если задать для свойства AllowAutoRedirect значения HttpWebRequest значение false, исключение будет вызвано, когда сервер отправит код состояния 300.

Это не мешает 404 кодам состояния генерировать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...