Предположим, у меня есть следующая переменная:
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);
c#
.net
system.net
Матиас Цицерон
источник
источник
int code = (int)Response.StatusCode
оттуда, вам нужно будет создать здесь свою собственнуюEnum
проверку для рабочего примера stackoverflow.com/questions/1330856/…HttpClient
классом?HttpResponseMessage
например, внутреннийHttpResponseMessage.IsSuccessStatusCode
(см. Мой ответ), которая точно такая же, как ваш первый подход, и сделать ее методом расширения дляHttpStatusCode
типа.Ответы:
Если вы пользуетесь
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
для создания исключения, если ответ не был успешным.источник
У класса HttpResponseMessage есть свойство IsSuccessStatusCode, если посмотреть на исходный код, это похоже на это, так как usr уже предположил, что 200–299, вероятно, лучшее, что вы можете сделать.
public bool IsSuccessStatusCode { get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); } }
источник
Принятый ответ меня немного беспокоит, поскольку он содержит магические числа (хотя они стандартные) во второй его части. И первая часть не является общей для простых целочисленных кодов состояния, хотя она близка к моему ответу.
Вы можете достичь точно такого же результата, создав экземпляр HttpResponseMessage с вашим кодом состояния и проверив его успех. Он вызывает исключение аргумента, если значение меньше нуля или больше 999.
if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode) { // ... }
Это не совсем кратко, но вы можете сделать его расширением.
источник
IsSuccessStatusCode
хорошо, используйте его (как сказано в принятом ответе). В противном случае не добавляйте свой собственный мусор, используя абстракцию, если вы не выполняете эту проверку повсюдуHttpResponseMessage
для использования одного из его свойств занимает больше времени, чем проверка двух логических условий с помощьюint
.Добавление в ответ @TomDoesCode Если вы используете HttpWebResponse, вы можете добавить этот метод расширения:
public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse) { return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299); }
источник
Я неравнодушен к открываемости методов расширения.
public static class HttpStatusCodeExtensions { public static bool IsSuccessStatusCode(this HttpStatusCode statusCode) { var asInt = (int)statusCode; return asInt >= 200 && asInt <= 299; } }
Пока ваше пространство имен находится в области видимости, использование будет
statusCode.IsSuccessStatusCode()
.источник
HttpStatusCode
в области видимости? Существует множество библиотек, которые не используются и не отображаются,HttpResponseMessage
но предоставляют код состояния.Это зависит от того, какой HTTP-ресурс вы вызываете. Обычно
2xx
диапазон определяется как диапазон кодов состояния успеха. Это явно соглашение, которого будет придерживаться не каждый HTTP-сервер.Например, отправка формы на веб-сайте часто возвращает 302 редирект.
Если вы хотите разработать общий метод, эта
code >= 200 && code < 300
идея, вероятно, будет вашим лучшим вариантом.Если вы вызываете свой собственный сервер, вам, вероятно, следует убедиться, что вы стандартизированы
200
.источник
Это расширение предыдущего ответа, которое позволяет избежать создания и последующей сборки мусора нового объекта для каждого вызова.
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); }
источник