2009-06-25 38 views
16

¿Alguien puede aconsejar cuál es la mejor manera de verificar (utilizando .NET 3.5) si hay un servidor remoto disponible?C# Comprobar servidor remoto

Estaba pensando en usar el siguiente código pero me gustaría saber si existe una mejor manera si la comunidad tiene otra opción.

TcpClient client = new TcpClient("MyServer", 80); 
if (!client.Connected) 
{ 
    throw new Exception("Unable to connect to MyServer on Port 80"); 
} 
client.Close(); 

Respuesta

25

Se podría ping que

Usted podría download the default page de ella

que podría hacer una petición HEAD

Si se trata de un servidor IIS 6 locales de la red, y tiene algunos detalles de administrador, usted podría connect to IIS usando un código de DirectoryEntry

Algunas de las respuestas en 136615 también pueden ayudar, específicamente las respuestas ans wer que habla de sockets

Para los servidores de impresión (o, específicamente, las impresoras), el código de K Scott here podría ayudar. Es código divertido para jugar de todos modos :-) Ese código menciona dns.resolve, que está obsoleto y se sustituye por Dns.GetHostEntry

Estoy a punto de salir de ideas :-)

+2

He aprendido mucho de esta publicación. Atentamente, Chris. –

8

Si solo quiere ver si un servidor determinado está en línea, un simple ping debería hacer el trabajo en la mayoría de los casos.

PingReply pingReply; 
using (var ping = new Ping()) 
    pingReply = ping.Send("http://www.stackoverflow.com/"); 
var available = pingReply.Status == IPStatus.Success; 

Al utilizar este método, no está abusando del servidor HTTP de ninguna manera, también.

De lo contrario (si desea comprobar si una conexión es posible en un puerto específico), básicamente se ve bien.

+0

que estaba bajo la impresión de que el uso del objeto Ping no era aconsejable en una intranet corporativa o dentro de una red con cortafuegos? Probablemente debería haber dicho que quiero verificar la disponibilidad en una red corporativa.¿Alguien puede comentar? – Kane

+0

@Kane: ¿Por qué no sería aconsejable? Un ping es la manera estándar, probada y probada para verificar la disponibilidad de un host. Abrir muchas conexiones HTTP y no hacer nada es más probable que constituya abuso/malicia. Si el puerto ping está cerrado, entonces ese es un asunto diferente; sin embargo, * * debe * estar abierto. – Noldorin

+0

Pensé que Ping podría no funcionar si un cortafuegos bloquea los paquetes Ping (ICMP Echo)? ¿Podría ser cierto ya que realmente no lo sé? – Kane

1

Supongo que quiere comprobar si hay un sitio web disponible. Puede usar un System.Net.WebRequest y verificar el resultado.

Actualización: Basado en su comentario, si tienes unos pocos servidores (y servicios) para supervisar, entonces tal vez sería una mejor idea de utilizar un paquete como Nagios, HostMonitor o IPSentry vez de rodar el tuyo

+0

Necesito verificar una serie de servidores. Algunos de los cuales son servidores web, algunos son simples servidores de archivos/impresión basados ​​en Windows. – Kane

3

sólo para añadir a la respuesta de Dan .. Solo tuve que implementar esto y aquí hay un pequeño fragmento de código que debería ayudar a aquellos que lo hacen aquí desde Google.

Imports System.Net 
Private Function URLExists(pURL As String) As Boolean 

    Try 
     'Creating the HttpWebRequest 
     Dim request As HttpWebRequest = TryCast(WebRequest.Create(pURL), HttpWebRequest) 
     'Setting the Request method HEAD, you can also use GET too. 
     request.Method = "HEAD" 
     'Getting the Web Response. 
     Dim response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse) 
     'Returns TURE if the Status code == 200 
     Return (response.StatusCode = HttpStatusCode.OK) 
    Catch 
     'Any exception will returns false. 
     Return False 
    End Try 
End Function 

lo siento es VB, pero eso es lo que tenía delante de mí. Lo dejaré como ejercicio para que el lector lo convierta en C# según sea necesario.

2

Si está utilizando una versión anterior de .NET Framework, como yo, la versión 2, no tendrá Ping ni System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(). A continuación, se puede utilizar para comprobar HttpWebRequest un anfitrión Disponibilidad:

public static bool AccessToWebService() 
    { 
     string host = "http://192.168.99.41"; 
     try 
     { 
      HttpWebRequest request = (HttpWebRequest) WebRequest.Create(host); 
      request.Method = "HEAD"; 
      HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 
      return response.StatusCode == HttpStatusCode.OK; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 
Cuestiones relacionadas