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

Как получить StatusCode из HttpRequestException?

Вероятно, мне не хватает чего-то очевидного.

Я использую HttpClient, который выдает HttpRequestException, который содержит StatusCode в строке сообщения.

Как я могу получить доступ к этому StatusCode?


Изменить: больше информации, я написал этот вопрос в спешке.

Я использую HttpClient для доступа к другому API в моем проекте WebApi. Да, я знаю, почему я звоню EnsureSuccessStatusCode(). Я хочу распространять некоторые ошибки ниже по течению, такие как 404 и 403.

Все, что я хотел, состояло в том, чтобы последовательно преобразовать HttpRequestException в HttpResponseException с помощью пользовательского ExceptionFilterAttribute.

К сожалению, HttpRequestException не несет никакой дополнительной информации, которую я мог бы использовать помимо сообщения. Я надеялся раскрыть StatusCode в raw (int или enum) форме.

Похоже, я могу:

  • Используйте сообщение для переключения кода состояния (bleh)
  • Или создайте мою версию EncureSuccessStatusCode и создайте исключение, которое действительно полезно.
4b9b3361

Ответ 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)