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ó.