2010-09-10 20 views
15

Qual è il modo più semplice in .NET per verificare quale codice di stato risponde un server Web a una richiesta GET?.NET: Verifica il codice di stato della risposta dell'URL?

Nota che non ho bisogno del corpo della risposta. Infatti, se possibile, dovrebbe essere richiesto solo l'header. Detto questo, tuttavia, se la richiesta di omettere il corpo della risposta aumenta significativamente la complessità del codice, ricevere il corpo andrebbe bene.

Inoltre, io sono particolarmente interessato a prendere tutte le possibili eccezioni appropriati (System.Net.WebException, System.IO.IOException, System.Net.Sockets.SocketException, etc.), come questa routine verrà eseguito migliaia di volte al giorno.

+0

Cosa biblioteca stai usando per effettuare la chiamata? – roufamatic

risposta

3

Se si utilizza HttpWebRequest, è abbastanza facile:

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

Si può circondare che con una clausola coperta cattura, o guardare la documentazione per WebRequest.Create e .GetResponse per vedere quali eccezioni andranno gettati.

12

utilizzare il metodo HTTP HEAD, che è la stessa come GET tranne non restituisce il corpo:

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

// status code... 
response.StatusCode; 

Da Section 9.4 of RFC2616:

Il metodo HEAD è identico a GET tranne che il server NON DEVE restituire il messaggio nella risposta. La metainformation contenuta nelle intestazioni HTTP in risposta a una richiesta HEAD DOVREBBE essere identica all'informazione inviata in risposta a una richiesta GET. Questo metodo può essere utilizzato per ottenere la metainformazioni sull'entità implicita dalla richiesta senza trasferimento del corpo dell'entità stesso. Questo metodo viene spesso utilizzato per il test dei collegamenti ipertestuali per la validità, l'accessibilità e la recente modifica .

+1

+1, Cool, non sapevo nulla del comando HEAD. –

+0

superbo !!! Credo che questo faccia il trucco per la mia domanda. –

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

ma se l'URL è 404 c'è un errore. impossibile trovare l'eccezione 404 – william

+0

In realtà, non si tratta di un errore. È una normale risposta HTTP con la differenza tra il codice di stato 404 .. –

+0

@ Ivan: Quindi, dovrei usare 'try-catch' per 404 pagine? – william

6

ho finito con questo metodo che combina la risposta di Ivan Féric e con una corretta eccezionali casi di supporto:

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; 
    } 
} 
Problemi correlati