Подтвердить что ты не робот

Как остановить .Net HttpWebRequest.GetResponse() создание исключения

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

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

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

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

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

4b9b3361

Ответ 1

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

Запрос не мог быть понят сервер из-за неправильного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запросить без изменений.

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

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

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

Ответ 2

Если вы хотите получить ответ об ошибке с ошибками 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);

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

Ответ 4

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

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