web-dev-qa-db-fra.com

Tester si un site Web est vivant à partir d'une application C #

Je recherche la meilleure façon de tester si un site Web est vivant à partir d'une application C #.

Contexte

Mon application se compose d'un Winforms UI, d'un backend service WCF et d'un site Web pour publier du contenu sur l'interface utilisateur et d'autres consommateurs. Pour éviter la situation où l'interface utilisateur démarre et ne fonctionne pas correctement en raison d'un service WCF ou d'un site Web manquant, j'ai ajouté une vérification de démarrage de l'application pour m'assurer que tout est en vie.

L'application est en cours d'écriture en C #, .NET 3.5, Visual Studio 2008

Solution actuelle

Actuellement, je fais une demande Web à une page de test sur le site Web qui va tester le site Web puis afficher un résultat.

WebRequest request = WebRequest.Create("http://localhost/myContentSite/test.aspx");
WebResponse response = request.GetResponse();

Je suppose que s'il n'y a aucune exception lors de cet appel, tout va bien et l'interface utilisateur peut commencer.

Question

Est-ce la manière la plus simple et correcte ou existe-t-il un autre appel sournois que je ne connais pas en C # ou une meilleure façon de le faire.

43
FryHard
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response == null || response.StatusCode != HttpStatusCode.OK)
81
Echostorm

Lorsque vous utilisez WebResponse, assurez-vous que vous fermez le flux de réponse, c'est-à-dire (.close), sinon il bloquerait la machine après certaines exécutions répétées. Par exemple

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sURL);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
// your code here
response.Close();
19
Maxymus

du projet NDiagnostics sur CodePlex ...

public override bool WebSiteIsAvailable(string Url)
{
  string Message = string.Empty;
  HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);

  // Set the credentials to the current user account
  request.Credentials = System.Net.CredentialCache.DefaultCredentials;
  request.Method = "GET";

  try
  {
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
      // Do nothing; we're only testing to see if we can get the response
    }
  }
  catch (WebException ex)
  {
    Message += ((Message.Length > 0) ? "\n" : "") + ex.Message;
  }

  return (Message.Length == 0);
}
9
ZombieSheep

En supposant que le service WCF et le site Web vivent dans la même application Web, vous pouvez utiliser un WebService "État" qui renvoie l'état de l'application. Vous souhaiterez probablement effectuer certaines des opérations suivantes:

  • Testez que la base de données est opérationnelle (bonne chaîne de connexion, service en place, etc ...)
  • Vérifiez que le site Web fonctionne (la façon dont cela dépend exactement du site Web)
  • Testez le fonctionnement de WCF (dépend exactement de votre implémentation)
  • Bonus supplémentaire: vous pouvez renvoyer des informations de version sur le service si vous avez besoin de prendre en charge différentes versions à l'avenir.

Ensuite, vous créez un client sur l'application Win.Forms pour le WebService. Si le WS ne répond pas (c'est-à-dire que vous obtenez une exception lors de l'invocation), le site Web est en panne (comme une "erreur générale").
Si le WS répond, vous pouvez analyser le résultat et vous assurer que tout fonctionne, ou si quelque chose est cassé, renvoyez plus d'informations.

3
Sklivvz

Nous pouvons aujourd'hui mettre à jour les réponses en utilisant HttpClient () :

HttpClient Client = new HttpClient();
var result = await Client.GetAsync("https://stackoverflow.com");
int StatusCode = (int)result.StatusCode;
3
Yanga