Prueba si un sitio web está vivo desde una aplicación de C #


Estoy buscando la mejor manera de probar si un sitio web está vivo desde una aplicación de C#.

Antecedentes

Mi aplicación consiste en una interfaz de usuario Winforms, un backend servicio WCF y un sitio web para publicar contenido en la interfaz de usuario y otros consumidores. Para evitar la situación en la que la interfaz de usuario se inicia y no funciona correctamente debido a la falta de un servicio WCF o sitio web que está abajo he añadido una comprobación de inicio de la aplicación para asegurarse de que todo está vivo.

La aplicación está siendo escrita en C#,. NET 3.5, Visual Studio 2008

Solución actual

Actualmente estoy haciendo una solicitud web a una página de prueba en el sitio web que inturn probar el sitio web y luego mostrar un resultado.

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

Estoy asumiendo que si no hay excepciones thown durante esta llamada entonces todo está bien y la interfaz de usuario puede comenzar.

Pregunta

¿Es esta la manera más simple, correcta o hay alguna otra llamada furtiva que no conozco acerca de en C# o una mejor manera de hacerlo.

Author: FryHard, 2008-10-09

7 answers

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response == null || response.StatusCode != HttpStatusCode.OK)
 71
Author: Echostorm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 11:58:44

Mientras usa WebResponse, asegúrese de cerrar el flujo de respuesta ie (.close) de lo contrario colgaría la máquina después de cierta ejecución repetida. Eg

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sURL);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
// your code here
response.Close();
 18
Author: Maxymus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-06 15:18:20

Del proyecto NDiagnostics en 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);
}
 8
Author: ZombieSheep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 12:03:17

Asumiendo que el servicio WCF y el sitio web viven en la misma aplicación web, puede usar un servicio web "Status" que devuelve el estado de la aplicación. Probablemente quieras hacer algo de lo siguiente:

  • Prueba que la base de datos está funcionando (buena cadena de conexión, servicio está activo, etc...)
  • Prueba que el sitio web está funcionando (cómo exactamente depende del sitio web)
  • Prueba que WCF está funcionando (cómo exactamente depende de tu implementación)
  • Bono añadido: puedes volver alguna información de control de versiones en el servicio si necesita admitir diferentes versiones en el futuro.

A continuación, se crea un cliente en la Victoria.Aplicación de formularios para el servicio WEB. Si el WS no responde (es decir, obtiene alguna excepción al invocar), entonces el sitio web está caído (como un "error general").
Si el WS responde, puede analizar el resultado y asegurarse de que todo funciona, o si algo está roto, devolver más información.

 3
Author: Sklivvz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 12:00:42

Hoy podemos actualizar las respuestas usando HttpClient():

HttpClient Client = new HttpClient();
var result = await Client.GetAsync("https://stackoverflow.com");
int StatusCode = (int)result.StatusCode;
 2
Author: Yanga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 16:30:29

Usted querrá comprobar el código de estado para OK (estado 200).

 -2
Author: Robert Rouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 11:55:40

Solución de: ¿Cómo se comprueba si un sitio web está en línea en C#?

var ping = new System.Net.NetworkInformation.Ping();

var result = ping.Send("https://www.stackoverflow.com");

if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
    return;
 -4
Author: NoloMokgosi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-11 07:57:30