Saltar al contenido

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

Luego de mucho trabajar pudimos dar con el resultado de este dilema que algunos de nuestros lectores de este espacio tienen. Si quieres compartir algo más puedes compartir tu conocimiento.

Solución:

Sería bueno si hubiera alguna forma de desactivar “lanzar el código que no es exitoso”, pero si detecta WebException, al menos puede usar la respuesta:

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)
            
                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 “consígame una respuesta incluso si no es un código de éxito” en un método separado. (Te sugiero que sigas lanzando si no hay una respuesta, por ejemplo, si no puedes conectarte).

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

Sé que esto ya se respondió hace mucho tiempo, pero creé un método de extensión para ayudar a otras personas que tienen 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);

Curiosamente, el HttpWebResponse.GetResponseStream() que obtienes de la WebException.Response no es lo mismo que el flujo de respuesta que habría recibido del servidor. En nuestro entorno, estamos perdiendo respuestas reales del servidor cuando un 400 estado HTTP el código se devuelve al cliente utilizando el HttpWebRequest/HttpWebResponse objetos. Por lo que hemos visto, el flujo de respuesta asociado con el WebException's HttpWebResponse se genera en el cliente y no incluye ninguno de los cuerpos de respuesta del servidor. Muy frustrante, ya que queremos enviarle un mensaje al cliente sobre el motivo de la solicitud incorrecta.

Acuérdate de que tienes la capacidad de agregar una reseña si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *