Вопрос

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

Это было полезно?

Решение

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

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 будет нулевой. В таком случае вы можете проверить ex.Status чтобы получить WebExceptionStatus.

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

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

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

(И для кого-то, кто хочет знать, как получить код HTTP-подстанции. Это невозможно. Это концепция 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 (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)

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

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

Я не уверен, что есть ли, но если бы была такая собственность, это не будет считаться надежным. А. WebException Может быть уволен по причинам, отличным от кодов ошибок HTTP, включая простые сетевые ошибки. Те, кто не имеет такого соответствия кода ошибки HTTP.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top