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.