Pregunta

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

¿Fue útil?

Solución

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

Otros consejos

Al utilizar el nulo condicional operador (?.) que pueda 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 de contendrá el HttpStatusCode . Cuando el se produce un corte más general como un error en la red, donde hay un código de estado HTTP se envía entonces entonces status será nulo. En ese caso se puede inspeccionar ex.Status para obtener el WebExceptionStatus .

Si lo que desea es una cadena descriptiva para iniciar la sesión en caso de un fallo puede utilizar el nula coalescencia operador (??) para obtener el error correspondiente:

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 de la cadena contendrá "NotFound". Por otro lado, si el servidor no está en línea la cadena contendrá "ConnectFailure" y así sucesivamente.

  

(Y para cualquiera que quiera saber cómo obtener el subestado HTTP   código. Eso no es posible. Es un concepto Microsoft IIS que sólo   iniciar sesión en el servidor y nunca se envía al cliente.)

Esto sólo funciona si WebResponse es un 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;
}

(I se dan cuenta de que la pregunta es antigua, pero es uno de los principales accesos a Google.)

Una situación común en la que desea conocer el código de respuesta está en el manejo de excepciones. A partir de C # 7, puede utilizar la coincidencia de patrones que en realidad sólo entrar en la cláusula catch si la excepción coincida con su predicado:

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

Esto puede fácilmente extenderse a otros niveles, como en este caso en el WebException era en realidad la excepción interna de otro (y que sólo está interesado en 404):

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

Por último:. Nota de cómo no hay necesidad de volver a lanzar la excepción en la cláusula catch cuando no coincide con sus criterios, ya que no entran en la cláusula en el primer lugar con la solución anterior

Se puede probar este código para obtener el código de estado HTTP de WebException. Se trabaja en Silverlight SL también, porque no tiene WebExceptionStatus.ProtocolError definido.

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

No estoy seguro de si hay pero si había un tal propiedad no sería considerado fiable. Un WebException puede ser despedido por razones distintas de códigos de error HTTP incluyendo errores de redes simples. Los que no tienen tal código de error HTTP correspondiente.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top