Как получить StatusCode из HttpRequestException?
Вероятно, мне не хватает чего-то очевидного.
Я использую HttpClient
, который выдает HttpRequestException
, который содержит StatusCode
в строке сообщения.
Как я могу получить доступ к этому StatusCode
?
Изменить: больше информации, я написал этот вопрос в спешке.
Я использую HttpClient
для доступа к другому API в моем проекте WebApi. Да, я знаю, почему я звоню EnsureSuccessStatusCode()
. Я хочу распространять некоторые ошибки ниже по течению, такие как 404 и 403.
Все, что я хотел, состояло в том, чтобы последовательно преобразовать HttpRequestException
в HttpResponseException
с помощью пользовательского ExceptionFilterAttribute
.
К сожалению, HttpRequestException
не несет никакой дополнительной информации, которую я мог бы использовать помимо сообщения. Я надеялся раскрыть StatusCode
в raw (int или enum) форме.
Похоже, я могу:
- Используйте сообщение для переключения кода состояния (bleh)
- Или создайте мою версию EncureSuccessStatusCode и создайте исключение, которое действительно полезно.
Ответы
Ответ 1
Код состояния был передан как часть строки в HttpRequestException
поэтому вы не можете восстановить его только из таких исключений.
Проект System.Net.Http
требует от вас доступа к HttpResponseMessage.StatusCode
вместо ожидания исключения.
http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Если вы сейчас следуете руководству Microsoft, убедитесь, что вы четко понимаете, почему оно запрашивает вызов HttpResponseMessage.EnsureSucessStatusCode
. Если вы не вызываете эту функцию, не должно быть никаких исключений.
Ответ 2
Для чего это стоит, этот парень сделал что-то умное: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -заместитель удаленного имени -webexception? форум = csharpgeneral
В случае, когда мне нужно свойство статуса исключения, я могу сделать это:
catch (HttpRequestException requestException)
{
if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure)
{
return true;
}
return false;
}
Ответ 3
Как уже упоминалось другими, это не очень хорошая практика, чтобы получить StatusCode из HttpRequestException, то же самое можно сделать заранее с HttpResponseMessage.StatusCode после проверки HttpResponseMessage.IsSuccessStatusCode
Во всяком случае, если из-за некоторого ограничения/требования нужно прочитать StatusCode,
Может быть два решения
- Расширенный HttpResponseMessage с объяснением вашего пользовательского исключения здесь
- Взломайте HttpRequestException.ToString, чтобы получить StatusCode. Поскольку сообщение является постоянным сообщением, фиксированным StatusCode и Repharse.
Ниже приведен код в System.Net.Http.HttpResponseMessage
Где SR.net_http_message_not_success_statuscode = "Код состояния ответа не указывает на успех: {0} ({1})."
public HttpResponseMessage EnsureSuccessStatusCode()
{
if (!this.IsSuccessStatusCode)
{
if (this.content != null)
{
this.content.Dispose();
}
throw new HttpRequestException(string.Format(CultureInfo.InvariantCulture, SR.net_http_message_not_success_statuscode, new object[]
{
(int)this.statusCode,
this.ReasonPhrase
}));
}
return this;
}
Ответ 4
Это сработало для меня
var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)