2010-09-10 13 views
15

¿Cuál es la forma más fácil en .NET para verificar qué código de estado responde un servidor web a una solicitud GET?.NET: ¿Verifica el código de estado de respuesta de la URL?

Tenga en cuenta que no necesito el cuerpo de la respuesta. De hecho, si es posible, solo se debe solicitar el encabezado. Dicho esto, sin embargo, si se solicita que se omita el cuerpo de la respuesta aumenta significativamente la complejidad del código, recibir el cuerpo estaría bien.

Además, estoy particularmente interesado en la captura de todas las posibles excepciones apropiados (System.NET.WebException, System.IO.IOException, System.Net.Sockets.SocketException, etc.), ya que esta rutina se ejecutará miles de veces al día.

+0

Lo biblioteca está utilizando para hacer la llamada? – roufamatic

Respuesta

3

Si utiliza HttpWebRequest, que es bastante fácil:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url"); 
request.Method = "GET"; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
HttpStatusCode status = response.StatusCode; 

Puede que la rodean con una cláusula catch manta, o buscar en la documentación para WebRequest.Create y .GetResponse para ver lo que va a ser expulsado excepciones.

12

utilizan el método HTTP HEAD, lo que es lo mismo que GET excepción no devuelve el cuerpo:

var request = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
request.Method = "HEAD"; 
var response = (HttpWebResponse)request.GetResponse(); 

// status code... 
response.StatusCode; 

De Section 9.4 of RFC2616:

El método HEAD es idéntica a GET excepto que el servidor NO DEBE devolver un cuerpo del mensaje en la respuesta. La metainformación contenida en los encabezados HTTP en respuesta a una solicitud HEAD DEBERÍA ser idéntica a la información enviada en respuesta a una solicitud GET. Este método se puede utilizar para obtener metainformación sobre la entidad implícita en la solicitud sin transfiriendo el propio cuerpo-entidad. Este método se utiliza a menudo para probar los enlaces de hipertexto para la validez, el acceso y la modificación reciente .

+1

+1, Genial, no sabía sobre el comando HEAD. –

+0

excelente !!! Creo que este es el truco para mi consulta. –

24
public HttpStatusCode GetHeaders(string url) 
    { 
     HttpStatusCode result = default(HttpStatusCode); 

     var request = HttpWebRequest.Create(url); 
     request.Method = "HEAD"; 
     using (var response = request.GetResponse() as HttpWebResponse) 
     { 
      if (response != null) 
      { 
       result = response.StatusCode; 
       response.Close(); 
      } 
     } 

     return result; 
    } 
+4

pero si la URL es 404 hay un error. no se puede encontrar la excepción 404 – william

+0

En realidad, no es un error. Es una respuesta HTTP regular con la diferencia de código de estado siendo 404 .. –

+0

@ Ivan: Entonces, ¿se supone que debo usar 'try - catch' para 404 páginas? – william

6

he terminado con este método que combina la respuesta de Ivan FERIC y con el adecuado soporte excepcionales casos:

public async Task<bool> IsAccessibleAsync (string url) 
{ 
    if (url == null) 
     throw new ArgumentNullException ("url"); 

    if (url.IndexOf (':') < 0) 
     url = "http://" + url.TrimStart ('/'); 

    if (!Uri.IsWellFormedUriString (url, UriKind.Absolute)) 
     return false; 

    var request = (HttpWebRequest) WebRequest.Create (url); 
    request.Method = "HEAD"; 

    try 
    { 
     using (var response = await request.GetResponseAsync() as HttpWebResponse) 
     { 
      if (response != null && response.StatusCode == HttpStatusCode.OK) 
       return true; 

      return false; 
     } 
    } 
    catch (WebException) 
    { 
     return false; 
    } 
} 
Cuestiones relacionadas