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

Я, наверное, упускаю что-то очевидное.

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

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


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

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

все, что я хотел последовательно трансформирует HttpRequestException на HttpResponseException С помощью настраиваемых ExceptionFilterAttribute.

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

похоже, я тоже могу:

  1. используйте сообщение для переключения кода состояния (bleh)
  2. или создать мою версию EnsureSuccessStatusCode и выбросить исключение, которое вообще-то можно.

4 ответов


код состояния был передан как часть строки в HttpRequestException Так что вы не можете восстановить его только из таких исключений.

конструкция System.Net.Http требуется доступ к HttpResponseMessage.StatusCode вместо того, чтобы ждать исключения.

http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs. 110).aspx

если вы сейчас следуете руководство Microsoft, убедитесь, что вы четко понимаете, почему он просит вас позвонить HttpResponseMessage.EnsureSucessStatusCode. Если вы не вызываете эту функцию, не должно быть никаких исключений.


для чего это стоит, этот парень сделал что-то умное: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception-webexception-the-remote-name?forum=csharpgeneral

в случае, когда мне нужно свойство статуса исключения, я могу сделать это:

catch (HttpRequestException requestException)
{
    if (requestException.InnerException is WebException && 
      ((WebException)requestException.InnerException).Status == WebExceptionStatus.NameResolutionFailure)
    {
        return true;
    }

    return false;
}

Как упоминалось другими, также не рекомендуется получать StatusCode из HttpRequestException, то же самое можно сделать заранее с HttpResponseMessage.StatusCode после проверки HttpResponseMessage.IsSuccessStatusCode

в любом случае, если из-за некоторых ограничений / требований необходимо прочитать StatusCode, Может быть два решения

  1. расширил HttpResponseMessage с вашим пользовательским исключением, объясненным здесь
  2. рубить на исключение HttpRequestException.ToString для получения состояния, как постоянная разноска по statusCode и Repharse.

ниже код в системе.Чистая.Протоколу 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;
    }

это сработало для меня

var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)