System.Net.WebException HTTP код состояния - PullRequest
139 голосов
/ 01 сентября 2010

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

Ответы [ 6 ]

226 голосов
/ 01 сентября 2010

Может быть, как-то так ...

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
    }
}
23 голосов
/ 17 января 2017

Используя нулевой условный оператор (?.), вы можете получить код состояния 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, которая только вошел на сервер и никогда не отправлял клиенту.)

8 голосов
/ 16 января 2014

это работает, только если 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;
}
6 голосов
/ 18 октября 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, если оно не соответствует вашим критериям, поскольку мы не вводим предложение в первую очередь с помощью вышеуказанного решения.

3 голосов
/ 09 декабря 2014

Вы можете попробовать этот код, чтобы получить код состояния 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;
}
1 голос
/ 01 сентября 2010

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

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

...