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



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

532   6  

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
    }
}

С помощью оператор (?.) вы можете получить код состояния HTTP с помощью одной строки кода:

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

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

если вы просто хотите, чтобы описательная строка войти в случае сбоя вы можете с помощью нуль-коалесцирующий оператор (??), чтобы получить соответствующие ошибки:

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

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

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

это работает только в том случае, если 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;
}

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

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

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

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

HttpStatusCode GetHttpStatusCode(WebException we)
{
    if (we.Response is HttpWebResponse)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        return response.StatusCode;
    }
    return null;
}

Comments

    Ничего не найдено.