2012-04-10 5 views
31

Estoy tratando de verificar la existencia de una Url usando HttpWebRequest. He encontrado algunos ejemplos que hacen básicamente el siguiente:¿Por qué HttpWebRequest lanza una excepción en lugar de devolver HttpStatusCode.NotFound?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
request.Method = "HEAD"; 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    return response.StatusCode; 
} 

Sin embargo, si la URL es de hecho roto, no es devolver una respuesta, que está en su lugar lanzar una excepción.

he modificado mi código para esto:

try 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
    request.Method = "HEAD"; 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     return response.StatusCode; 
    } 
} 
catch (System.Net.WebException ex) 
{ 
    var response = ex.Response as HttpWebResponse; 
    return response == null ? HttpStatusCode.InternalServerError : response.StatusCode; 
} 

que parece finalmente hacer lo que quiero.

Pero me gustaría saber por qué la solicitud arroja una excepción en lugar de devolver la respuesta con un código de estado NotFound.

Respuesta

54

Ya esto puede ser bastante molesto cuando las páginas web usan códigos de estado en gran medida y no todas ellas son errores. Lo cual puede hacer que el procesamiento del cuerpo sea bastante doloroso. Personalmente utilizo este método de extensión para obtener la respuesta.

public static class HttpWebResponseExt 
{ 
    public static HttpWebResponse GetResponseNoException(this HttpWebRequest req) 
    { 
     try 
     { 
      return (HttpWebResponse)req.GetResponse(); 
     } 
     catch (WebException we) 
     { 
      var resp = we.Response as HttpWebResponse; 
      if (resp == null) 
       throw; 
      return resp; 
     } 
    } 
} 
+6

Si bien este es el trabajo mínimo para guardar código utilizando HttpWebRequest/Response de esta opción de diseño incorrecto en la parte de autores de .Net Framework, la solución correcta es usar HttpClient, que no aplica códigos de estado 4xx y 5xx. Las excepciones están pensadas para situaciones excepcionales, y lanzar solo para atraparlo y proceder como si todo estuviera bien, es feo y malo para el rendimiento, especialmente dado que hay una mejor opción que lo evita por completo. https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx –

+1

esto no parece ser cierto; Estoy usando HttpClient en un proyecto y cuando se llama a una url que no existe y que devuelve un código de estado 404, el cliente lanza una excepción en lugar de devolver una respuesta con el código de estado 404. ¿Hay algún paso adicional en el uso de httpclient para evitar esto? – SelAromDotNet

2

¿Por qué no? Ambas son opciones de diseño válidas, y HttpWebRequest fue diseñado para funcionar de esta manera.

+0

Mientras usted puede leer los encabezados de respuesta y el cuerpo cuando el código es 4xx –

+4

supongo que estaba confundido, porque ninguno de los ejemplos de código que he visto para este tomó esto en consideración. muchos ni siquiera tenían un try/catch, y me preguntaba si tal vez me perdí algo y hay una manera de obtener el estado sin lanzar una excepción. simplemente parece contradictorio lanzar una excepción completa si el código de estado está diseñado para manejar dicho estado – SelAromDotNet

+1

Sí, siempre conduce a resultados interesantes cuando piensas que "por supuesto xxx probó la línea de código que puso en su sitio web". y resulta ser un error :) –

Cuestiones relacionadas