2015-09-14 3 views
42

Давайте предположим, что у меня есть следующие переменные:Проверка 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); 
+0

вам нужно сделать 'Int код = (ИНТ) Response.StatusCode' оттуда нужно будет создать свой собственный' Enum' проверить здесь для работы примера http://stackoverflow.com/questions/1330856/ get-http-status-code-number-200-301-404-etc-from-httpwebrequest-and-ht – MethodMan

+0

Вы случайно используете класс 'HttpClient'? – dcastro

+0

@ dcastro Нет, извините. Я использую * высокий уровень * API, который может (или не может) использовать его внутренне. API предоставляет код состояния ответа, но не раскрывает внутренний 'HttpResponseMessage', например –

ответ

83

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

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

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

В случае вам интересно, это свойство implemented как:

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

Таким образом, вы можете просто повторно использовать этот алгоритм, если вы не с помощью HttpClient непосредственно.

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

3

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

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

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

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

6

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

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

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

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

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

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

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

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

+0

Это отлично сработало для меня, поскольку у меня был только HttpStatusCode, а не ответ. Отличная работа! –

+0

«Принятый ответ меня немного беспокоит, поскольку он содержит магические числа (хотя они и являются стандартными)» - они не «волшебные», если они стандартизированы, хорошо поняты и никогда не изменятся. Абсолютно ничего плохого в использовании кодов нет. Если у вас есть «IsSuccessStatusCode», тогда отлично, используйте его (как говорится в принятом ответе). В противном случае не добавляйте свой собственный рывок, используя абстракцию, если вы не выполняете эту проверку повсюду –

0

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

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); 
} 
Смежные вопросы