2009-06-25 51 views
16

Qualcuno può consigliare quale è il modo migliore per verificare (utilizzando .NET 3.5) se è disponibile un server remoto?C# Controlla server remoto

Stavo pensando di utilizzare il seguente codice ma vorrei sapere se esiste un modo migliore se la comunità ha un'altra opzione.

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

risposta

25

Si potrebbe ping si

Si potrebbe download the default page da esso

Si potrebbe fare un HEAD richiesta

Se si tratta di un server IIS6 locale sulla rete, e si dispone di alcuni dettagli di amministrazione, si potrebbe connect to IIS utilizzando qualche codice DirectoryEntry

Alcune delle risposte su 136615 potrebbero essere utili, in particolare le ans accettate wer that parla di sockets

Per i server di stampa (o, in particolare, le stampanti), il codice di K Scott here potrebbe essere d'aiuto. E 'il codice divertente giocare con in ogni caso :-) Quel codice menziona dns.resolve, che è obsoleto e sostituito da Dns.GetHostEntry

sto a corto di idee :-)

+2

Ho imparato tanto da questo post. Cordiali saluti, Chris. –

8

Se si desidera solo per vedere se un determinato server è in linea, poi un semplice ping dovrebbe fare il lavoro nella maggior parte dei casi.

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

Utilizzando questo metodo non si sta abusando del server HTTP in alcun modo.

Altrimenti (se si desidera verificare se una connessione è possibile su una porta specifica), ciò sembra fondamentalmente soddisfacente.

+0

ho avuto l'impressione che utilizzando l'oggetto Ping non era opportuno, in un'intranet aziendale o all'interno di una rete con firewall? Probabilmente avrei dovuto mettere quello che voglio verificare la disponibilità su una rete aziendale.Qualcuno può commentare? – Kane

+0

@Kane: Perché non sarebbe consigliabile? Un ping è lo standard, provato e testato, per verificare la disponibilità di un host. L'apertura di molte connessioni HTTP e il non fare nulla è più probabile che equivalga ad abuso/malizia. Se la porta ping è chiusa, allora è diverso, tuttavia * dovrebbe * essere aperto. – Noldorin

+0

Ho pensato che Ping potrebbe non funzionare se un firewall blocca i pacchetti Ping (ICMP Echo)? Potrebbe essere vero perché non lo so davvero? – Kane

1

Immagino che vogliate controllare se un sito web è disponibile. Potresti semplicemente usare un System.Net.WebRequest e controllare il risultato.

Aggiornamento: In base al commento, se hai un paio di server (e servizi) per monitorare, allora forse sarebbe una migliore idea di utilizzare un pacchetto come Nagios, HostMonitor o IPSentry invece di rotolare il tuo.

+0

Ho bisogno di controllare un numero di server. Alcuni dei quali sono server Web alcuni semplici server di file/stampa basati su Windows. – Kane

3

solo per aggiungere alla risposta di Dan .. Ho appena dovuto implementare questo ed ecco un piccolo frammento di codice che dovrebbe aiutare quelli che lo fanno da 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 

scusa è VB ma è quello che avevo di fronte a me. Lascerò come esercizio per il lettore convertire questo in C# secondo necessità.

2

Se si utilizza una versione precedente di .NET Framework, come me, la versione 2, non si avrà Ping e non System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(). Quindi, è possibile utilizzare HttpWebRequest per controllare un Disponibilità host:

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; 
     } 
    }