Код состояния HTTP System.Net.WebException

Есть ли простой способ получить код состояния HTTP из System.Net.WebException?


person Gilsham    schedule 31.08.2010    source источник


Ответы (6)


Может что-то вроде этого ...

try
{
    // ...
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        var response = ex.Response as HttpWebResponse;
        if (response != null)
        {
            Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
        }
        else
        {
            // no http status code available
        }
    }
    else
    {
        // no http status code available
    }
}
person LukeH    schedule 01.09.2010
comment
но в случае исключения webexception connectfailure я получаю ответ как null, в этом случае как я могу получить код httpstatus - person Rusty; 20.03.2014
comment
@rusty: Ты не можешь. В случае сбоя подключения код состояния HTTP не требуется. - person LukeH; 20.03.2014
comment
Если это ошибка ProtocolError, вам не нужно проверять ответ на null. См. Комментарий в примере на этой странице MSDN. - person Andras Toth; 20.05.2014
comment
@AndrasToth Но такие инструменты, как ReSharper, выдадут вам предупреждение, если вы пропустите нулевую проверку. И в любом случае защитный код - хорошая практика. - person Tom Lint; 19.02.2015
comment
@TomLint Я не думаю, что это связано с предупреждениями или защитным кодированием, дело в том, что @LukeH использует оператор as, который является динамическим преобразованием, поэтому проверка на null заключается в том, чтобы увидеть, сработало ли приведение во время выполнения. - person ympostor; 27.06.2017
comment
@ympostor Я знаю, но есть люди, которые просто считают, что актерский состав просто работает. И часто это так, в зависимости от ситуации. Проверка нуля дает вам уверенность в том, что ваше предположение действительно было правильным, и предотвращает непредвиденные исключения в случае сбоя приведения. - person Tom Lint; 05.07.2017
comment
Как получить значение HTTP Substatus? Например, 404.13 Content Length Too Large Reference: docs.microsoft.com/en-us/iis/configuration/system.webServer/ - person Kiquenet; 23.03.2018

Используя условный оператор null (?.), вы можете получить HTTP код состояния одной строкой кода:

 HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;

Переменная status будет содержать HttpStatusCode < / а>. Когда происходит более общий сбой, такой как сетевая ошибка, когда код состояния HTTP не отправляется, тогда status будет нулевым. В этом случае вы можете проверить ex.Status, чтобы получить WebExceptionStatus.

Если вам просто нужна описательная строка для регистрации в случае сбоя, вы можете использовать null -Coalescing оператор (??), чтобы получить соответствующую ошибку:

string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
    ?? ex.Status.ToString();

Если исключение возникло в результате кода состояния HTTP 404, строка будет содержать «NotFound». С другой стороны, если сервер отключен, строка будет содержать «ConnectFailure» и так далее.

(И для всех, кто хочет знать, как получить код подстатуса HTTP. Это невозможно. Это концепция Microsoft IIS, которая регистрируется только на сервере и никогда не отправляется клиенту.)

person Martin Liversage    schedule 17.01.2017
comment
Не уверен, был ли оператор ?. изначально назван оператором распространения null или условным оператором null во время предварительной версии. Но Atlassian resharper выдает предупреждение об использовании оператора нулевого распространения в таких сценариях. Приятно знать, что он также называется условным оператором с нулевым значением. - person RBT; 05.03.2017
comment
Немного поздно для этой стороны, но справедливое предупреждение о том, что условный оператор null - это функция C # 6.0, поэтому необходимо использовать компилятор, который его поддерживает. Ответ о переполнении стека с более подробной информацией. VS 2015+ имеет его по умолчанию, но если кто-то использует какую-либо среду сборки / развертывания, кроме своей машины, могут потребоваться другие вещи. - person CodeHxr; 12.12.2017

это работает, только если WebResponse является HttpWebResponse.

try
{
    ...
}
catch (System.Net.WebException exc)
{
    var webResponse = exc.Response as System.Net.HttpWebResponse;
    if (webResponse != null && 
        webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
    {
        MessageBox.Show("401");
    }
    else
        throw;
}
person pr0gg3r    schedule 16.01.2014
comment
зачем иметь дело только с 401-Unauthorized вместо всех возможных кодов состояния ошибки HTTP? это худший ответ - person ympostor; 27.06.2017
comment
@ympostor Это всего лишь пример. Любой разумный разработчик это понимает. Ваш комментарий самый легкомысленный, который я когда-либо читал здесь. - person pr0gg3r; 28.06.2017

(Я понимаю, что вопрос старый, но он входит в число популярных в Google.)

Типичная ситуация, когда вы хотите узнать код ответа, - это обработка исключений. Начиная с C # 7, вы можете использовать сопоставление с образцом, чтобы фактически вводить предложение catch только в том случае, если исключение соответствует вашему предикату:

catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
     doSomething(response.StatusCode)
}

Это можно легко распространить на другие уровни, например, в этом случае, когда WebException фактически был внутренним исключением другого (а нас интересует только 404):

catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)

Наконец: обратите внимание, что нет необходимости повторно генерировать исключение в предложении catch, если оно не соответствует вашим критериям, поскольку мы не вводим предложение в первую очередь с указанным выше решением.

person miniyou    schedule 18.10.2017

Вы можете попробовать этот код, чтобы получить код состояния HTTP из WebException. Это работает и в Silverlight, потому что SL не имеет определенного WebExceptionStatus.ProtocolError.

HttpStatusCode GetHttpStatusCode(WebException we)
{
    if (we.Response is HttpWebResponse)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        return response.StatusCode;
    }
    return null;
}
person Sergey    schedule 09.12.2014
comment
return 0? или лучше HttpStatusCode? (nullable)? - person Kiquenet; 23.03.2018
comment
Это сработает? var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);} - person FMFF; 30.11.2018
comment
Я не могу понять, что вы хотели сделать в этом примере. В каких случаях вы хотели, чтобы событие регистрировалось? - person Sergey; 02.12.2018

Я не уверен, есть ли там, но если бы такая собственность была, она не считалась бы надежной. WebException может быть запущен по причинам, отличным от кодов ошибок HTTP, включая простые сетевые ошибки. У них нет такого совпадающего кода ошибки http.

Не могли бы вы дать нам немного больше информации о том, чего вы пытаетесь достичь с помощью этого кода. Возможно, есть лучший способ получить необходимую информацию.

person JaredPar    schedule 31.08.2010