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

如何在C#MongoDB驱动程序v2.0中获取连接状态?,c#,mongodb,mongodb.driver,C#,Mongodb,Mongodb.driver,我们开始使用新的,我们不知道我们是否连接到数据库 我们的存储库代码: var client = new MongoClient("mongodb://{wrong-host}:{wrong-port}/{dbbname}"); var database = client.GetDatabase(url.DatabaseName); 其中错误的主机和错误的端口是无效值 首先,我们认为若并没有人监听指定的地址,但驱动程序并没有抛出异常,那个么会引发异常 下一步是调用数据库上的方法: var dbs

我们开始使用新的,我们不知道我们是否连接到数据库

我们的存储库代码:

var client = new MongoClient("mongodb://{wrong-host}:{wrong-port}/{dbbname}");
var database = client.GetDatabase(url.DatabaseName);
其中
错误的主机
错误的端口
是无效值

首先,我们认为若并没有人监听指定的地址,但驱动程序并没有抛出异常,那个么会引发异常

下一步是调用数据库上的方法:

var dbs = client.ListDatabasesAsync().Result.ToListAsync().Result;
在这里,我们有30秒的自由,比例外。我们不适合等待30秒来了解我们是否已连接

System.TimeoutException:选择一个 使用CompositeServerSelector{Selectors的服务器= ReadPreferenceServerSelector{ReadPreference={Mode=Primary, 标记集=[]},LatencyMitingServerSelector{AllowedLatencyRange= 00:00:00.0150000 } }. 群集状态的客户端视图为{ClusterId: “1”,类型:“未知”,状态:“已断开”,服务器:[{ServerId: {ClusterId:1,端点:*****},端点:*****,状态: “断开连接”,类型:“未知”,异常: “MongoDB.Driver.MongoConnectionException:运行时发生异常 正在打开与服务器的连接。--> 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<BsonDocument>(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;
}

下一个解决方法是:

使用新的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<BsonDocument>("collectionName");
                var filter1 = Builders<BsonDocument>.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);
            }
试试看
{
MongoClient=新的MongoClient(“xxx”);
//如果您正在运行localhost,请将参数设置为空
var db=client.GetDatabase(“dbName”);
var collection=db.GetCollection(“collectionName”);
var filter1=Builders.Filter.Empty;
var filter=新的BsonDocument();
var计数=0;
使用(var cursor=await collection.FindAsync(过滤器))
{
while(等待cursor.MoveNextAsync())
{
var batch=cursor.Current;
foreach(批量var文档)
{
计数++;
}
}
}
Show(count.ToString());
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}

您的客户端代码必须能够处理不可靠的网络,请记住,每一次网络操作都可能发生超时。请让您的代码具有抵御这些问题的能力。即使您刚刚验证了连接是否正常,也可能会在一毫秒后断开,而这忽略了连接池的复杂性和奇怪的路由问题、数据包丢失等。对于初始连接,您的解决方案可能有效,但不必要地严格,很难保证小于1s(网络拥塞、服务器繁忙、连接池已满等)
var client = new MongoClient(new MongoClientSettings
{
       Server = new MongoServerAddress("xxxx"),
       ClusterConfigurator = builder =>
       {
             builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(10)));
       }
});
         try
            {
                MongoClient client = new MongoClient("xxx"); 
                // if you're running localhost let the parameter empty
                var db = client.GetDatabase("dbName");
                var collection = db.GetCollection<BsonDocument>("collectionName");
                var filter1 = Builders<BsonDocument>.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);
            }