Ответ 1
Здесь метод ping:
var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
server.Ping();
Я использую драйверы MongoDB
для подключения к базе данных. Когда моя форма загружается, я хочу настроить соединение и проверить, нормально оно или нет. Я делаю это так:
var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
var database = server.GetDatabase("reestr");
Но я не знаю, как проверить соединение. Я попытался наложить этот код на try-catch
, но безрезультатно. Даже если я создаю неверный connectionString, я все равно не могу получить сообщение об ошибке.
Здесь метод ping:
var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
server.Ping();
Чтобы загрузить сервер с новым драйвером 3.0, выполните следующие действия:
var database = client.GetDatabase("YourDbHere");
database.RunCommandAsync((Command<BsonDocument>)"{ping:1}")
.Wait();
полный пример для 2.4.3 - где "client.GetServer()" недоступен. основанный на ответе "Пол Кейстер".
client = new MongoClient("mongodb://localhost");
database = client.GetDatabase(mongoDbStr);
bool isMongoLive = database.RunCommandAsync((Command<BsonDocument>)"{ping:1}").Wait(1000);
if(isMongoLive)
{
// connected
}
else
{
// couldn't connect
}
Если вы хотите обрабатывать проблемы с подключением в своей программе, вы можете использовать событие ICluster.Description
.
Когда создается MongoClient
, он будет продолжать попытки подключений в фоновом режиме до тех пор, пока он не удастся выполнить.
using MongoDB.Driver;
using MongoDB.Driver.Core.Clusters;
var mongoClient = new MongoClient("localhost")
mongoClient.Cluster.DescriptionChanged += Cluster_DescriptionChanged;
public void Cluster_DescriptionChanged(object sender, ClusterDescriptionChangedEventArgs e)
{
switch (e.NewClusterDescription.State)
{
case ClusterState.Disconnected:
break;
case ClusterState.Connected:
break;
}
}
У меня был тот же вопрос, что и у OP, и пробовал каждое решение, которое я смог найти в Интернете... Ну, ни один из них не работал на мое истинное удовлетворение, поэтому я решил провести исследование, чтобы найти надежный и отзывчивый способ проверить, жив ли соединение с сервером базы данных MongoDB. И это без блокировки синхронного выполнения приложения в течение слишком длительного периода времени...
Итак, вот мои предпосылки:
Я предоставил новую установку MongoDB (версия 3.6) по адресу localhost по умолчанию: mongodb://localhost: 27017. Я также записал еще один URL-адрес, где не было сервера базы данных MongoDB: mongodb://localhost: 27071.
Я также использую С# Driver 2.4.4 и не использовать устаревшую реализацию (сборка MongoDB.Driver.Legacy).
Итак, мои ожидания в том, что когда я проверяю подключение к первому URL-адресу, он должен дать мне Ok для живого соединения с существующим сервером MongoDB, когда я проверяю соединение со вторым URL-адресом, который должен дайте мне Fail для несуществующего сервера MongoDB...
Используя метод IMongoDatabase.RunCommand, запрашивает сервер и завершает тайм-аут ответа сервера, тем самым не отступая от предпосылок. Кроме того, после таймаута он прерывается с TimeoutException, что требует дополнительной обработки исключений.
Этот актуальный вопрос SO, а также этот вопрос SO доставил большую часть информации о начале, которая мне нужна для моего решения... Итак, ребята, большое спасибо за это!
Теперь мое решение:
private static bool ProbeForMongoDbConnection(string connectionString, string dbName)
{
var probeTask =
Task.Run(() =>
{
var isAlive = false;
var client = new MongoDB.Driver.MongoClient(connectionString);
for (var k = 0; k < 6; k++)
{
client.GetDatabase(dbName);
var server = client.Cluster.Description.Servers.FirstOrDefault();
isAlive = (server != null &&
server.HeartbeatException == null &&
server.State == MongoDB.Driver.Core.Servers.ServerState.Connected);
if (isAlive)
{
break;
}
System.Threading.Thread.Sleep(300);
}
return isAlive;
});
probeTask.Wait();
return probeTask.Result;
}
Идея этого заключается в том, что MongoDB Server не реагирует (и, кажется, не существует), пока не будет предпринята реальная попытка получить доступ к некоторому ресурсу на сервере (например, базе данных). Но получить один ресурс в одиночку недостаточно, так как сервер по-прежнему не имеет обновлений своего состояния в описании кластера серверов. Это обновление происходит во-первых, когда ресурс снова извлекается. С этого момента сервер имеет действительное описание кластера и действительные данные внутри него...
Как мне кажется, сервер MongoDB не проактивно распространяет свое описание кластера для всех подключенных клиентов. Вместо этого каждый клиент получает описание, когда был сделан запрос на сервер. Если у некоторых из вас есть более подробная информация об этом, пожалуйста, подтвердите или отклоните мое понимание по теме...
Теперь, когда мы нацеливаем неверный URL-адрес сервера MongoDB, описание кластера остается недействительным, и мы можем поймать и доставить полезный сигнал для этого случая...
Итак, следующие утверждения (для действительного URL)
// The admin database should exist on each MongoDB 3.6 Installation, if not explicitly deleted!
var isAlive = ProbeForMongoDbConnection("mongodb://localhost:27017", "admin");
Console.WriteLine("Connection to mongodb://localhost:27017 was " + (isAlive ? "successful!" : "NOT successful!"));
распечатает
Соединение с mongodb://localhost: 27017 прошло успешно!
и операторы (для недопустимого URL)
// The admin database should exist on each MongoDB 3.6 Installation, if not explicitly deleted!
isAlive = ProbeForMongoDbConnection("mongodb://localhost:27071", "admin");
Console.WriteLine("Connection to mongodb://localhost:27071 was " + (isAlive ? "successful!" : "NOT successful!"));
распечатает
Подключение к mongodb://localhost: 27071 не удалось!