HttpRequestException против WebException

Это общий вопрос, который меня смущает. Я думал, что как только запрос REST будет сделан, ошибка вернется через WebException, В одном случае у меня получаю HttpRequestException, что не позволяет мне получить код состояния HTTP.

Я новичок в этом деле, но в чем разница между ними? Почему есть два типа? Когда один привыкнет, а не другой?

WebException Кажется, работает хорошо. HttpRequestException похоже, очень слабая его версия, где он знает код состояния (в своем сообщении), но он не скажет мне явно, что это было.

РЕДАКТИРОВАТЬ: я использую HttpClient, Конкретно звонит client.GetStreamAsync(),

2 ответа

Существует три различных сценария сбоя:

а) Вы не можете подключиться к серверу или прокси-серверу, и в этом случае возникает исключение HttpRequestException. Имейте в виду, что если ваш сервер не работает и вы используете Fiddler, вы никогда не увидите это исключение, вы получите код состояния 5XX.

б) При чтении / записи сетевого потока, есть какое-то прерывание, вы получите IOException.

в) Вы получите ответ с HttpStatusCode с кодом состояния 4XX/5XX. Если ваше клиентское приложение решит вызвать response.EnsureSuccessStatusCode(), то будет выдано исключение HttpRequestException.

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

Если вам действительно нужно создать исключение, а затем обработать код состояния, тогда я предлагаю вам создать собственный метод расширения, чтобы заменить EnsureSuccessStatusCode и создать собственное исключение, которое может хранить код состояния. Или, предпочтительно, переведите код состояния в одно из нескольких различных исключений на основе корректирующих действий, которые вы хотите предпринять.

Класс WebException: исключение, которое выдается, когда возникает ошибка при доступе к сети через подключаемый протокол.

Класс HttpRequestException: базовый класс для исключений, создаваемых классами HttpClient и HttpMessageHandler.

Я думаю, что внутреннее исключение HttpRequestException может быть WebException, однако я не уверен, что это когда-либо.


Обратите внимание, что 404, 302 или любой другой ответ, кроме 200 (ОК), не является исключением. Эти ответы являются совершенно действительными ответами HTTP.

https://github.com/dotnet/runtime/pull/32455 добавляет StatusCode к HttpRequestException в.NET 5.

Другие вопросы по тегам