Подтвердить что ты не робот

Проверка того, является ли HttpStatusCode успешным или неудачным

Предположим, что у меня есть следующая переменная:

System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;

Как проверить, является ли это кодом статуса успеха или неудачным?

Например, я могу сделать следующее:

int code = (int)status;
if(code >= 200 && code < 300) {
    //Success
}

Я также могу иметь белый список:

HttpStatusCode[] successStatus = new HttpStatusCode[] {
     HttpStatusCode.OK,
     HttpStatusCode.Created,
     HttpStatusCode.Accepted,
     HttpStatusCode.NonAuthoritativeInformation,
     HttpStatusCode.NoContent,
     HttpStatusCode.ResetContent,
     HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
    //Success
}

Ни один из этих альтернатив не убеждает меня, и я надеялся на .NET-класс или метод, который может сделать эту работу для меня, например:

bool isSuccess = HttpUtilities.IsSuccess(status);
4b9b3361

Ответ 1

Если вы используете класс HttpClient, вы получите HttpResponseMessage.

Этот класс имеет полезное свойство IsSuccessStatusCode, которое проверит вас.

using (var client = new HttpClient())
{
    var response = await client.PostAsync(uri, content);
    if (response.IsSuccessStatusCode)
    {
        //...
    }
}

Если вам интересно, это свойство реализовано как:

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

Поэтому вы можете просто повторно использовать этот алгоритм, если вы не используете HttpClient напрямую.

Вы также можете использовать EnsureSuccessStatusCode для исключения, если ответ не был успешным.

Ответ 2

Класс HttpResponseMessage обладает свойством IsSuccessStatusCode, смотрящим на исходный код, так как usr уже предложил 200-299, вероятно, лучшее, что вы можете сделать.

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

Ответ 3

Принятый ответ меня немного беспокоит, поскольку он содержит магические числа (хотя они и являются стандартными) во второй части. И первая часть не является общей для простых кодов состояния целого числа, хотя она близка к моему ответу.

Вы можете достичь точно такого же результата, создав HttpResponseMessage с кодом состояния и проверив успех. Это вызывает исключение аргумента, если значение меньше нуля или больше 999.

if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
    // ...
}

Это не совсем лаконично, но вы можете сделать это расширением.

Ответ 4

Добавление в ответ @TomDoesCode Если вы используете HttpWebResponse вы можете добавить этот метод расширения:

public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
    return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}

Ответ 5

Это зависит от того, какой HTTP-ресурс вы вызываете. Обычно диапазон 2xx определяется как диапазон кодов состояния успеха. Это ясно соглашение, которое не каждый HTTP-сервер будет придерживаться.

Например, отправка формы на веб-сайте часто возвращает перенаправление 302.

Если вы хотите разработать общий метод, то идея code >= 200 && code < 300, вероятно, будет вашим лучшим снимком.

Если вы вызываете свой собственный сервер, вам, вероятно, следует убедиться, что вы стандартизируете 200.

Ответ 6

Я неравнодушен к открываемости методов расширения.

public static class HttpStatusCodeExtensions
{
    public static bool IsSuccessStatusCode(this HttpStatusCode statusCode)
    {
        var asInt = (int)statusCode;
        return asInt >= 200 && asInt <= 299;
    }
}

Пока ваше пространство имен находится в области видимости, использование будет statusCode.IsSuccessStatusCode().

Ответ 7

Это расширение предыдущего ответа, которое позволяет избежать создания и последующей сборки мусора нового объекта для каждого вызова.

public static class StatusCodeExtensions
{
    private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>();
    public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode);
}

Ответ 8

if (response.IsCompletedSuccessfully)
{
//
}