httpresponsemessage codes code c# http-status-codes webexception

httpresponsemessage - http response codes c#



Código de estado HTTP System.Net.WebException (6)

(Me doy cuenta de que la pregunta es antigua, pero está entre los principales éxitos en Google).

Una situación común en la que desea saber el código de respuesta es en el manejo de excepciones. A partir de C # 7, puede usar la coincidencia de patrones para ingresar realmente la cláusula catch si la excepción coincide con su predicado:

catch (WebException ex) when (ex.Response is HttpWebResponse response) { doSomething(response.StatusCode) }

Esto se puede extender fácilmente a otros niveles, como en este caso donde WebException fue realmente la excepción interna de otro (y solo nos interesa 404 ):

catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)

Finalmente: observe cómo no hay necesidad de volver a lanzar la excepción en la cláusula de captura cuando no coincide con sus criterios, ya que no ingresamos la cláusula en primer lugar con la solución anterior.

¿Hay alguna manera fácil de obtener el código de estado HTTP de una System.Net.WebException ?


Al usar el operador nulo-condicional ( ?. ) Puede obtener el código de estado HTTP con una sola línea de código:

HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;

El status variable contendrá el HttpStatusCode . Cuando hay una falla más general, como un error de red en el que no se envía código de estado HTTP, el status será nulo. En ese caso, puede inspeccionar ex.Status para obtener WebExceptionStatus .

Si solo desea que se inicie una cadena descriptiva en caso de error, puede usar el operador nulo-coalescente ( ?? ) para obtener el error relevante:

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

Si la excepción se produce como resultado de un código de estado HTTP 404, la cadena contendrá "NotFound". Por otro lado, si el servidor está fuera de línea, la cadena contendrá "ConnectFailure", y así sucesivamente.

(Y para cualquier persona que quiera saber cómo obtener el código HTTP del subsuelo. Eso no es posible. Se trata de un concepto de Microsoft IIS que solo se registra en el servidor y nunca se envía al cliente).


No estoy seguro de si lo hay pero si existiera tal propiedad no se consideraría confiable. Se puede disparar una WebException por razones distintas de los códigos de error HTTP, incluidos los errores de red simples. Esos no tienen ese código de error http correspondiente.

¿Puede darnos un poco más de información sobre lo que está tratando de lograr con ese código? Puede haber una mejor manera de obtener la información que necesita.


Puede probar este código para obtener el código de estado HTTP de WebException. También funciona en Silverlight porque SL no tiene definido WebExceptionStatus.ProtocolError.

HttpStatusCode GetHttpStatusCode(WebException we) { if (we.Response is HttpWebResponse) { HttpWebResponse response = (HttpWebResponse)we.Response; return response.StatusCode; } return null; }


Tal vez algo como esto ...

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


esto funciona solo si WebResponse es una 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; }