Как вы называете команду Ping
с новым драйвером C# 2.0?
В старом драйвере он был доступен через Server.Ping()
? Кроме того, есть ли способ узнать, работает ли сервер/отвечает, не запуская фактический запрос?
Использование mongoClient.Cluster.Description.State
не помогает, поскольку оно все еще дало отключенное состояние даже после того, как сервер mongo начал отвечать.MongoDB Driver 2.0 C# есть ли способ узнать, нет ли сервера? В новом драйвере как мы запускаем команду Ping?
ответ
Вы можете проверить состояние кластера, используя его Description
свойство:
var state = _client.Cluster.Description.State
Если вы хотите конкретный сервер из этого кластера можно использовать Servers
свойство:
var state = _client.Cluster.Description.Servers.Single().State;
Я пробовал это, но даже после того, как сервер пришел в сеть, состояние возвращалось как отключенное. –
@HeenaPatel AFAIK отражает состояние последней операции. Чтобы действительно проверить соединение, необходимо сделать активную операцию и посмотреть, не сработает ли она. – i3arnon
mongoClient.Cluster.Description.State не является надежным - заметили даже после того, как сервер вернулся, мы получили состояние как отключенное. Я надеялся использовать Ping для проверки теста быстрой связи и исключения исключений и не переходить к запросу, чтобы отличать исключения подключения от случайного таймаута запроса/команды из-за задержки ответа ответа из-за количества записей. –
Это работало для меня на обоих водителях 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");
}
}
Как ответ @ 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
}
возможно дубликат [MongoServer.State эквивалент в драйвере 2.0] (http://stackoverflow.com/questions/29459990/mongoserver-state-equivalent-in-the-2-0-driver) – i3arnon
почему бы вы используете ping вместо контролируемого таймаута соединения? Если у вас высокий пинг, когда вы подключитесь к серверу, ваше «общее время для подключения к db» будет удвоено (время пинга + реальное время соединения) –
mongoClient.Cluster.Description.State не является надежным - заметили даже после сервер вернулся, мы получили состояние как отключенное. Я надеялся использовать Ping для проверки теста быстрой связи и исключения исключений и не переходить к запросу, чтобы дифференцировать исключения для подключения к случайному тайм-ауту запроса/команды из-за задержки возврата ответа из-за количества записей. –