如何在C#MongoDB驱动程序v2.0中获取连接状态?

我们开始使用新的MongoDB驱动程序v2 ,我们无法理解我们是否连接到数据库。

我们的仓库代码:

var client = new MongoClient("mongodb://{wrong-host}:{wrong-port}/{dbbname}"); var database = client.GetDatabase(url.DatabaseName); 

wrong-hostwrong-port是无效值。

首先,我们认为如果没有人正在侦听指定的地址但驱动程序没有抛出exception将被引发。

下一步是在db上调用方法:

 var dbs = client.ListDatabasesAsync().Result.ToListAsync().Result; 

在这里,我们有freez 30秒而不是例外。 我们不适合等待30秒来了解我们是否联系。

System.TimeoutException:使用CompositeServerSelector选择服务器30000ms后出现超时{Selectors = ReadPreferenceServerSelector {ReadPreference = {Mode = Primary,TagSets = []}},LatencyLimitingServerSelector {AllowedLatencyRange = 00:00:00.0150000}}。 集群状态的客户端视图是{ClusterId:“1”,类型:“未知”,状态:“已断开连接”,服务器:[{ServerId:“{ClusterId:1,EndPoint:”****“}”,EndPoint: “****”,状态:“Disconnected”,键入:“Unknown”,HeartbeatException:“MongoDB.Driver.MongoConnectionException:打开与服务器的连接时发生exception.—> System.Net.Sockets.SocketException :无法建立连接,因为目标计算机主动拒绝它******

最后,我们尝试设置不同的超时但没有任何改变。

 var client = new MongoClient(new MongoClientSettings { SocketTimeout = TimeSpan.FromSeconds(1), MaxConnectionIdleTime = TimeSpan.FromSeconds(1), MaxConnectionLifeTime = TimeSpan.FromSeconds(1), ConnectTimeout = TimeSpan.FromSeconds(1), Servers = url.Servers }); 

所以问题是我们如何知道我们是否在短时间间隔〜(1-2)秒内连接到mongo?

[UPD]

我们目前的解决方案是

 private IMongoDatabase Connect(string connectionString, TimeSpan timeout) { var url = MongoUrl.Create(connectionString); var client = new MongoClient(url); var db = client.GetDatabase(url.DatabaseName); var pingTask = db.RunCommandAsync(new BsonDocument("ping", 1)); pingTask.Wait(timeout); if (pingTask.IsCompleted) log.InfoFormat("Connected to: {0}.", connectionString); else throw new TimeoutException(string.Format("Failed to connect to: {0}.", connectionString)); return db; } 

用法

 database = Connect(connectionString, TimeSpan.FromSeconds(1)); 

此问题有下一个解决方法:

 var client = new MongoClient(new MongoClientSettings { Server = new MongoServerAddress("xxxx"), ClusterConfigurator = builder => { builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(10))); } }); 

使用新API:

  try { MongoClient client = new MongoClient("xxx"); // if you're running localhost let the parameter empty var db = client.GetDatabase("dbName"); var collection = db.GetCollection("collectionName"); var filter1 = Builders.Filter.Empty; var filter = new BsonDocument(); var count = 0; using (var cursor = await collection.FindAsync(filter)) { while (await cursor.MoveNextAsync()) { var batch = cursor.Current; foreach (var document in batch) { count++; } } } MessageBox.Show(count.ToString()); } catch(Exception ex) { MessageBox.Show(ex.Message); }