2010-10-15 36 views
0

Je suis en train de faire une application simple qui « ping » un uri et me dire si sa réponse ou nontest si un URI est en

je le code suivant, mais il semble que pour vérifier les domaines à la racine

-à-dire www.google.com et non www.google.com/voice~~V~~3rd

private bool WebsiteUp(string path) 
    { 

     bool status = false; 

     try 
     { 
      Uri uri = new Uri(path); 
      WebRequest request = WebRequest.Create(uri); 
      request.Timeout = 3000; 
      WebResponse response; 
      response = request.GetResponse(); 
      if (response.Headers != null) 
      { 
       status = true; 
      } 

     } 
     catch (Exception loi) 
     { 
      return false; 
     } 


     return status; 
    } 

y at-il un code existant là-bas qui permettrait de mieux répondre à ce besoin?

Répondre

2

Edit: En fait, je dis un mensonge - par défaut 404 devrait provoquer une exception Web de toute façon, et je viens de confirmer cela au cas où j'étais misremembering. Alors que le code donné dans l'exemple est perméable, il devrait toujours fonctionner. Puzzling, mais je vais laisser cette réponse ici pour la meilleure sécurité avec l'objet de réponse.


Le problème avec le code que vous avez, est que pendant qu'il vérifie bien l'URI précis donné, il considère 404, 500, 200, etc. comme également « succès ». Il est également un peu inutile d'utiliser GET pour faire un travail HEAD suffit. Il devrait vraiment nettoyer cette WebResponse aussi. Et le terme path est un nom de paramètre stupide pour quelque chose qui n'est pas seulement un chemin, pendant que nous y sommes.

private bool WebsiteUp(string uri) 
{ 
    try 
    { 
     WebRequest request = WebRequest.Create(uri); 
     request.Timeout = 3000; 
     request.Method = "HEAD"; 
     using(WebResponse response = request.GetResponse()) 
     { 
      HttpWebResponse hRes = response as HttpWebResponse; 
      if(hRes == null) 
       throw new ArgumentException("Not an HTTP or HTTPS request"); // you may want to have this specifically handle e.g. FTP, but I'm just throwing an exception for now. 
      return hRes.StatusCode/100 == 2; 
     } 
    } 
    catch (WebException) 
    { 
     return false; 
    } 
} 

Bien sûr, il y a des sites pauvres là-bas qui renvoient un 200 tout le temps et ainsi de suite, mais c'est le meilleur peut faire. Il suppose que dans le cas d'une redirection, vous vous souciez de la cible ultime de la redirection (finissez-vous sur une page réussie ou une page d'erreur), mais si vous vous souciez de l'URI spécifique, vous pouvez désactiver la redirection automatique, et considérons les codes 3xx réussis aussi.

+0

c'est assez cool. Je reçois une erreur que je ne peux pas appliquer "/" au code des opérations et int – Crash893

+0

si je le cast comme (int) cela fonctionne – Crash893

+0

Oups, oui. Il devrait avoir un cast à int (l'alternative est de tester contre tout type de succès possible, mais le lancer vers int devrait être plus à l'épreuve du temps et preuve d'un comportement fou, non-standard mais conforme à l'esprit-de-norme). –

0

Je l'ai fait quelque chose de similaire quand j'ai écrit un client torrent pour vérifier Tracker valide URLS, assez sûr que je trouve la réponse sur SO mais ne peux pas le trouver plus, heres l'échantillon de code que j'ai de ce poste.

using(var client = new WebClient()) { 
     client.HeadOnly = true; 
     // exists 
     string Address1 = client.DownloadString("http://google.com"); 
     // doesnt exist - 404 error 
     string Address2 = client.DownloadString("http://google.com/sdfsddsf"); 
    } 
+0

Inclure également le code pour 'MyClient'? –

+0

Désolé cela devrait être "WebClient" dans l'espace de noms System.Net: p – kyndigs