c# .net system.net

c# - Comprobando si HttpStatusCode representa éxito o falla



.net system.net (7)

Agregar a la respuesta @TomDoesCode Si está utilizando HttpWebResponse, puede agregar este método de extensión:

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

Supongamos que tengo la siguiente variable:

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

¿Cómo puedo verificar si este es un código de estado de éxito o uno de falla?

Por ejemplo, puedo hacer lo siguiente:

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

También puedo tener algún tipo de lista blanca:

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

Ninguna de estas alternativas me convence, y esperaba una clase o método .NET que pueda hacer este trabajo por mí, como:

bool isSuccess = HttpUtilities.IsSuccess(status);


Depende de qué recurso HTTP esté llamando. Por lo general, el rango 2xx se define como el rango de códigos de estado de éxito. Esa es claramente una convención a la que no todos los servidores HTTP se adherirán.

Por ejemplo, enviar un formulario en un sitio web a menudo devolverá una redirección 302.

Si desea diseñar un método general, entonces el code >= 200 && code < 300 idea es probablemente su mejor opción.

Si llama a su propio servidor, entonces probablemente debería asegurarse de estandarizar en 200 .


Esta es una extensión de la respuesta anterior, que evita la creación y posterior recolección de basura de un nuevo objeto para cada invocación.

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


La clase HttpResponseMessage tiene una propiedad IsSuccessStatusCode, mirando el código fuente es así, por lo que usr ya ha sugerido que 200-299 es probablemente lo mejor que puede hacer.

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


La respuesta aceptada me molesta un poco ya que contiene números mágicos (aunque están en el estándar) en su segunda parte. Y la primera parte no es genérica para los códigos de estado enteros simples, aunque está cerca de mi respuesta.

Puede lograr exactamente el mismo resultado instanciando HttpResponseMessage con su código de estado y verificando el éxito. Lanza una excepción de argumento si el valor es menor que cero o mayor que 999.

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

Esto no es exactamente conciso, pero podría convertirlo en una extensión.


Si está utilizando la clase HttpClient , recibirá un mensaje HttpResponseMessage .

Esta clase tiene una propiedad útil llamada IsSuccessStatusCode que hará la verificación por usted.

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

En caso de que tenga curiosidad, esta propiedad se implemented como:

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

Por lo tanto, puede reutilizar este algoritmo si no está utilizando HttpClient directamente.

También puede usar EnsureSuccessStatusCode para EnsureSuccessStatusCode una excepción en caso de que la respuesta no haya sido exitosa.


Soy parcial en la capacidad de descubrimiento de los métodos de extensión.

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

Mientras su espacio de nombres esté dentro del alcance, el uso sería statusCode.IsSuccessStatusCode() .