2015-06-08 2 views
6

Как вы называете команду Ping с новым драйвером C# 2.0?
В старом драйвере он был доступен через Server.Ping()? Кроме того, есть ли способ узнать, работает ли сервер/отвечает, не запуская фактический запрос?
Использование mongoClient.Cluster.Description.State не помогает, поскольку оно все еще дало отключенное состояние даже после того, как сервер mongo начал отвечать.MongoDB Driver 2.0 C# есть ли способ узнать, нет ли сервера? В новом драйвере как мы запускаем команду Ping?

+0

возможно дубликат [MongoServer.State эквивалент в драйвере 2.0] (http://stackoverflow.com/questions/29459990/mongoserver-state-equivalent-in-the-2-0-driver) – i3arnon

+0

почему бы вы используете ping вместо контролируемого таймаута соединения? Если у вас высокий пинг, когда вы подключитесь к серверу, ваше «общее время для подключения к db» будет удвоено (время пинга + реальное время соединения) –

+0

mongoClient.Cluster.Description.State не является надежным - заметили даже после сервер вернулся, мы получили состояние как отключенное. Я надеялся использовать Ping для проверки теста быстрой связи и исключения исключений и не переходить к запросу, чтобы дифференцировать исключения для подключения к случайному тайм-ауту запроса/команды из-за задержки возврата ответа из-за количества записей. –

ответ

3

Вы можете проверить состояние кластера, используя его Description свойство:

var state = _client.Cluster.Description.State 

Если вы хотите конкретный сервер из этого кластера можно использовать Servers свойство:

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

Я пробовал это, но даже после того, как сервер пришел в сеть, состояние возвращалось как отключенное. –

+0

@HeenaPatel AFAIK отражает состояние последней операции. Чтобы действительно проверить соединение, необходимо сделать активную операцию и посмотреть, не сработает ли она. – i3arnon

+1

mongoClient.Cluster.Description.State не является надежным - заметили даже после того, как сервер вернулся, мы получили состояние как отключенное. Я надеялся использовать Ping для проверки теста быстрой связи и исключения исключений и не переходить к запросу, чтобы отличать исключения подключения от случайного таймаута запроса/команды из-за задержки ответа ответа из-за количества записей. –

1

Это работало для меня на обоих водителях C# 2 и 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

Как ответ @ i3arnon I ca п сказать, что это было надежным для меня таким образом:

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

или в новых версиях .Net

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

Но если вы действительно хотите, чтобы выполнить команду пинг вы можете сделать это следующим образом:

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