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

use*_*301 6 c# mongodb mongodb.driver

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

我们的存储库代码

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

wrong-hostwrong-port无效的值.

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

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

var dbs = client.ListDatabasesAsync().Result.ToListAsync().Result;
Run Code Online (Sandbox Code Playgroud)

在这里,我们有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:打开与服务器的连接时发生异常.---> 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
  });
Run Code Online (Sandbox Code Playgroud)

所以问题是如何在短时间间隔〜(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;
}
Run Code Online (Sandbox Code Playgroud)

用法

database = Connect(connectionString, TimeSpan.FromSeconds(1));
Run Code Online (Sandbox Code Playgroud)

rno*_*nko 3

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

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