2011-09-23 17 views
21

Quiero que mi programa en C# compruebe si un sitio web está en línea antes de la ejecución, ¿cómo haré que mi programa haga ping al sitio web y busque una respuesta en C#?¿Cómo verifica si un sitio web está en línea en C#?

+5

tiene tanto ejemplos sincrónicas y asincrónicas en el cuadro [Clase] (Ping http://msdn.microsoft.com/en- us/library/system.net.networkinformation.ping.aspx) página en MSDN. – drew010

+0

+1. Aprendió algo nuevo: D –

+2

También puede usar la clase WebClient y solicitar un recurso o una url. Ping no necesariamente significa que el sitio web está en línea, a menos que solo quiera verificar que el servidor esté activo. – lahsrah

Respuesta

38

Usted tiene uso System.Net.NetworkInformation.Ping ver más abajo.

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

var result = ping.Send("www.google.com"); 

if (result.Status != System.Net.NetworkInformation.IPStatus.Success) 
    return; 
+6

Ping no le dice si un sitio web está en línea, solo si su pila de red está respondiendo. Además, está pasando una URL HTML para hacer ping, lo que no sería legal. –

+1

Esta es, de lejos, la mejor respuesta, y dado que la clase incluso se llama "Ping", es probablemente la respuesta más correcta también. Gracias por tu ayuda. Además, si alguien está leyendo esto en el futuro, aquí está el enlace al manual: http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx – Alper

+0

En cuanto a mí, no funciona - arroja una excepción (cuando el host no está disponible) en lugar de simplemente manejarlo y devolver un valor IPStatus correspondiente – Laserson

1

La forma más simple que puedo pensar es algo así como:

WebClient webClient = new WebClient(); 
byte[] result = webClient.DownloadData("http://site.com/x.html"); 

DownloadData será una excepción si el sitio no está en línea.

Probablemente haya una forma similar de hacer ping al sitio, pero es poco probable que la diferencia se note a menos que esté revisando muchas veces por segundo.

+9

No debería tener que descargar toda la página solo para verificar que el sitio está activo – BrokenGlass

+0

El webclient funciona mejor para mí en lugar de la httpwebrequest, después de ejecutar el error 503, httpwebrequest sigue lanzando 503 mientras webclient está trabajando nuevamente. – bert

40

Un ping solo le dice que el puerto está activo, no le dice si realmente es un servicio web allí.

Mi sugerencia es realizar una solicitud HTTP HEAD contra la URL

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("your url"); 
request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector 
request.Method = "HEAD"; 
try { 
    response = request.GetResponse(); 
    // do something with response.Headers to find out information about the request 
} catch (WebException wex) 
{ 
    //set flag if there was a timeout or some other issues 
} 

Esto será en realidad no se ha podido recuperar la página HTML, pero le ayudará a averiguar el mínimo de lo que necesita saber. Lo siento si el código no se compila, esto está fuera de mi cabeza.

+7

Perfecto. Por cierto, hay una const para "HEAD" para los que les importa. System.Net.WebRequestMethods.Http.Head. –

13

pequeña observación para el código de Digicoder y completo ejemplo de método de ping:

private bool Ping(string url) 
{ 
    try 
    { 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
     request.Timeout = 3000; 
     request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector 
     request.Method = "HEAD"; 

     using (var response = request.GetResponse()) 
     { 
      return true; 
     } 
    } 
    catch 
    { 
     return false; 
    } 
} 
+1

¿Qué pasa si la configuración del servidor no me permite enviar httprequest en un servidor particular? – Adrian

+0

Si está probando un servidor que no permite HEAD pero permite GET o POST, obtendrá un falso positivo. – Vlad

+0

Gracias por la respuesta.Me ayudaste mucho :) –

3
if (!NetworkInterface.GetIsNetworkAvailable()) 
{ 
    // Network does not available. 
    return; 
} 

Uri uri = new Uri("http://stackoverflow.com/any-uri"); 

Ping ping = new Ping(); 
PingReply pingReply = ping.Send(uri.Host); 
if (pingReply.Status != IPStatus.Success) 
{ 
    // Website does not available. 
    return; 
} 
+0

hasta vote por incluir el cheque simple en NetworkInterfaceGetIsNetworkAvailable() first – LucasS

+0

Downvote para perpetuar el mito de que una respuesta de ping tiene algo que ver con la disponibilidad de un sitio web. – spender

Cuestiones relacionadas