Essa verificação é importante para evitar que o usuário receba erros de conexão não tratados, o que pode prejudicar sua experiência e comprometer o funcionamento da aplicação.
Consulta rápida:
Por padrão, o driver do MongoDB para C# não verifica o status da conexão com o servidor do banco de dados até que alguma operação de leitura ou escrita seja realizada. Devido a essa característica, é importante tratar as possíveis exceções que podem ser geradas ao tentar conectar, o que pode ser feito da seguinte forma:
01 try
02 {
03 var settings = new MongoClientSettings {
04 ServerSelectionTimeout = new TimeSpan(0,0,5),
05 Server = new MongoServerAddress("localhost", 27017)
06 };
07
08 var client = new MongoClient(settings);
09
10 var database = client.GetDatabase("loja");
11
12 var colecao = database.GetCollection<Cliente>("colecao_teste");
13
14 var filtro = Builders<Cliente>.Filter.Eq(c => c.Endereco.UF, "RJ");
15
16 var clientes = colecao.Find(filtro).ToList();
17 }
18 catch (TimeoutException)
19 {
20 Console.WriteLine($"Erro: Não foi possível conectar ao servidor (time out após 5 segundos).");
21 }
Caso não seja possível estabelecer uma conexão com o MongoDB, o driver irá disparar uma exceção do tipo TimeOutException, que precisa ser tratada para que possamos exibir uma mensagem amigável para o usuário;
Na linha 4 configuramos o tempo de Time Out para 5 segundos, a fim de receber uma resposta mais rapidamente (o padrão é de 30s);
Na linha 16, quando a consulta for feita no banco por meio do método Find, a exceção será disparada;
Entre as linhas 18 e 21 tratamos a exceção e exibimos uma mensagem no console.
Outra alternativa:
01 try
02 {
03 var settings = new MongoClientSettings {
04 ServerSelectionTimeout = new TimeSpan(0,0,5),
05 Server = new MongoServerAddress("localhost", 27017)
06 };
07
08 var client = new MongoClient(settings);
09
10 var database = client.GetDatabase("loja");
11
12 var comando = new BsonDocument("ping", 1);
13
14 var resultado = database.RunCommandAsync<BsonDocument>(comando).Result;
15 }
16 catch (Exception e)
17 {
18 if(e.InnerException != null && e.InnerException is TimeoutException)
19 Console.WriteLine($"Erro: Não foi possível conectar ao servidor.");
20 }
Outra alternativa para verificar a conexão é disparar um comando ping contra o servidor que, se não estiver ativo, fará com que a aplicação gere uma exceção;
Na linha 12 montamos o comando ping como um documento BSON, que é o formato utilizado pelo MongoDB;
Na linha 14 executamos o comando ping, que irá disparar a exceção;
Nessa abordagem será disparada uma Exception que na sua propriedade InnerException, a qual representa, de fato, o erro de time out.