.Net HttpWebRequest.GetResponse() genera una excepción cuando se devuelve el código de estado http 400 (solicitud incorrecta)
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.
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.DefaultMaximumErrorResponseLength
para asegurarse de obtener el error completo.
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);
}