2010-09-10 15 views
15

Jaki jest najprostszy sposób w .NET, aby sprawdzić, jaki kod stanu odpowiada serwer WWW na żądanie GET?.NET: Sprawdź kod statusu odpowiedzi adresu URL?

Należy pamiętać, że nie potrzebuję treści odpowiedzi. W rzeczywistości, jeśli to możliwe, należy zażądać tylko nagłówka. Powiedziawszy to jednak, jeśli żądanie pomijania treści odpowiedzi znacznie zwiększy złożoność kodu, otrzymanie ciała byłoby w porządku.

Również jestem szczególnie zainteresowany w łapaniu wszystkich możliwych odpowiednich wyjątków (System.Net.WebException, System.IO.IOException, System.Net.Sockets.SocketException, etc.), jak ta procedura będzie działać tysiące razy dziennie.

+0

Jakie biblioteki używasz, aby nawiązać połączenie? – roufamatic

Odpowiedz

3

Jeśli używasz HttpWebRequest, to całkiem proste:

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

można otoczyć że z klauzuli catch koc, albo spojrzeć na docs dla WebRequest.Create i .GetResponse aby zobaczyć co będzie się wyjątki wyrzucane.

12

Użyj metody HTTP HEAD, która jest taka sama jak GET chyba nie zwraca ciała:

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

// status code... 
response.StatusCode; 

Od Section 9.4 of RFC2616:

Metoda HEAD jest identyczna z tą różnicą, że GET serwer NIE POWINIEN zwracać treści wiadomości w odpowiedzi. Metainformacja zawarta w nagłówkach HTTP w odpowiedzi na żądanie HEAD powinna być identyczna z informacją wysłaną w odpowiedzi na żądanie GET. Ta metoda może być używana do uzyskania metainformacji o jednostce implikowanej przez żądanie bez przesłania przesyłania samej jednostki-ciała. Ta metoda jest często używana do testowania linków hipertekstowych pod kątem poprawności , a także do modyfikacji i niedawnej modyfikacji .

+1

+1, Fajnie, nie wiedziałem o poleceniu HEAD. –

+0

superb !!! Sądzę, że to wystarczy na moje zapytanie. –

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

, ale jeśli adres URL to 404, wystąpił błąd. nie można znaleźć 404 wyjątku – william

+0

W rzeczywistości nie jest to błąd. Jest to zwykła odpowiedź HTTP z różnicą w kodzie statusu będącą 404 .. –

+0

@ Ivan: Czy powinienem użyć 'try-catch' dla 404 stron? – william

6

mam skończył z tą metodą, która łączy odpowiedź Ivan Ferić i przy odpowiednim wsparciu wyjątkowych przypadkach:

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; 
    } 
} 
Powiązane problemy