2015-06-08 9 views
6

Come si chiama il comando Ping con il nuovo driver C# 2.0?
Nel vecchio driver era disponibile tramite Server.Ping()? Inoltre, c'è un modo per scoprire se il server è in esecuzione/risponde senza eseguire la query effettiva?
L'utilizzo di mongoClient.Cluster.Description.State non è di aiuto perché ha ancora dato lo stato disconnesso anche dopo che il server mongo ha iniziato a rispondere.MongoDB Driver 2.0 C# c'è un modo per scoprire se il server non funziona? Nel nuovo driver come eseguiamo il comando Ping?

+0

possibile duplicato del [MongoServer.State equivalente nel driver 2.0] (http://stackoverflow.com/questions/29459990/mongoserver-state-equivalent-in-the-2-0-driver) – i3arnon

+0

perché sarebbe usi ping invece di un timeout di connessione controllata? Se hai un ping alto, quando ti connetti al server il tuo "tempo totale per connettersi al db" sarà raddoppiato (tempo di ping + tempo di connessione reale) –

+0

mongoClient.Cluster.Description.State non è affidabile - notato anche dopo il server era tornato che stavamo ottenendo lo stato come disconnesso. Speravo di usare il Ping per verificare il test di connettività rapida e lanciare eccezioni e non procedere alla query per differenziare le eccezioni di connettività rispetto al timeout di query/comando occasionale a causa del ritardo nella risposta a causa del numero di record. –

risposta

3

È possibile controllare lo stato del cluster utilizzando la sua proprietà Description:

var state = _client.Cluster.Description.State 

Se si desidera che un server specifico da quella dei cluster è possibile utilizzare la proprietà Servers:

var state = _client.Cluster.Description.Servers.Single().State; 
+0

L'ho provato, ma anche dopo che il server è arrivato online lo stato stava tornando come Disconnected. –

+0

@HeenaPatel AFAIK questo riflette lo stato dell'ultima operazione. Per verificare effettivamente la connessione è necessario effettuare un'operazione attiva e vedere se fallisce. – i3arnon

+1

mongoClient.Cluster.Description.State non è affidabile: si è notato che anche dopo che il server era tornato, lo stato veniva disconnesso. Speravo di utilizzare il Ping per verificare il test di connettività rapida e generare eccezioni e non procedere alla query per differenziare le eccezioni di connettività rispetto al timeout di query/comando occasionali a causa del ritardo nella risposta a causa del numero di record. –

1

Questo ha funzionato per me su entrambi i driver C# 2 e 1

int count = 0; 
var client = new MongoClient(connection); 
     // This while loop is to allow us to detect if we are connected to the MongoDB server 
     // if we are then we miss the execption but after 5 seconds and the connection has not 
     // been made we throw the execption. 
     while (client.Cluster.Description.State.ToString() == "Disconnected") { 
      Thread.Sleep(100); 
      if (count++ >= 50) { 
       throw new Exception("Unable to connect to the database. Please make sure that " 
        + client.Settings.Server.Host + " is online"); 
      } 
     } 
0

Come risposta @ i3arnon I ca n dire che era affidabile per me in questo modo:

var server = client.Cluster.Description.Servers.FirstOrDefault(); 
var serverState = ServerState.Disconnected; 
if (server != null) serverState = server.State; 

o nelle nuove versioni di Net

var serverState = client.Cluster.Description.Servers.FirstOrDefault()?.State 
    ?? ServerState.Disconnected; 

Ma se davvero desidera eseguire un comando ping si può fare in questo modo:

var command = new CommandDocument("ping", 1); 
try 
{ 
    db.RunCommand<BsonDocument>(command); 
} 
catch (Exception ex) 
{ 
    // ping failed 
} 
Problemi correlati