.Net HttpWebRequest.GetResponse() genera una excepción cuando se devuelve el código de estado http 400 (solicitud incorrecta)

Resuelto chefsmart asked hace 15 años • 7 respuestas

Estoy en una situación en la que cuando recibo un código HTTP 400 del servidor, es una forma completamente legal de que el servidor me diga qué estaba mal con mi solicitud (usando un mensaje en el contenido de la respuesta HTTP).

Sin embargo, .NET HttpWebRequest genera una excepción cuando el código de estado es 400.

¿Cómo manejo esto? Para mí, un 400 es completamente legal y bastante útil. El contenido HTTP tiene información importante, pero la excepción me desvía del camino.

chefsmart avatar Mar 28 '09 13:03 chefsmart
Aceptado

Sería bueno si hubiera alguna forma de desactivar "lanzar código no exitoso", pero si detecta WebException, al menos puede usar la respuesta (si la hay):

using System;
using System.IO;
using System.Web;
using System.Net;

public class Test
{
    static void Main()
    {
        WebRequest request = WebRequest.Create("http://csharpindepth.com/asd");
        try
        {
            using (WebResponse response = request.GetResponse())
            {
                Console.WriteLine("Won't get here");
            }
        }
        catch (WebException e)
        {
            using (WebResponse response = e.Response)
            {
                // TODO: Handle response being null
                HttpWebResponse httpResponse = (HttpWebResponse) response;
                Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
                using (Stream data = response.GetResponseStream())
                using (var reader = new StreamReader(data))
                {
                    string text = reader.ReadToEnd();
                    Console.WriteLine(text);
                }
            }
        }
    }
}

Es posible que desee encapsular el bit "obténme una respuesta incluso si no es un código de éxito" en un método separado. (Te sugiero que aún lances si no hay respuesta, por ejemplo, si no puedes conectarte).

Si la respuesta de error puede ser grande (lo cual es inusual), es posible que desee modificarla HttpWebRequest.DefaultMaximumErrorResponseLengthpara asegurarse de obtener el error completo.

Jon Skeet avatar Mar 28 '2009 07:03 Jon Skeet

Sé que esto ya fue respondido hace mucho tiempo, pero creé un método de extensión para, con suerte, ayudar a otras personas que tengan esta pregunta.

Código:

public static class WebRequestExtensions
{
    public static WebResponse GetResponseWithoutException(this WebRequest request)
    {
        if (request == null)
        {
            throw new ArgumentNullException("request");
        }

        try
        {
            return request.GetResponse();
        }
        catch (WebException e)
        {
            if (e.Response == null)
            {
                throw;
            }

            return e.Response;
        }
    }
}

Uso:

var request = (HttpWebRequest)WebRequest.CreateHttp("http://invalidurl.com");

//... (initialize more fields)

using (var response = (HttpWebResponse)request.GetResponseWithoutException())
{
    Console.WriteLine("I got Http Status Code: {0}", response.StatusCode);
}
Matthew avatar Jan 17 '2013 17:01 Matthew