MongoClient 忽略连接字符串

MongoClient ignores the connection string

我刚开始使用 MongoDB(4.4) 及其 C# 驱动程序。我使用默认选项 localhost:27017 设置了我的 MongoDB。然后我开启了授权,创建了一个root权限的超级用户,像这样:

db.createUser(
  {
    user: "superuser",
    pwd: "123",
    roles: [ "root" ]
  }
)

我在 Mongo shell 和 Compass 上都测试过,一切都按预期工作,使用正确的密码连接,并用错误的密码拒绝。

然后我创建了一个 C# windows 表单应用程序,使用 NuGet 安装所有必需的包,例如 MongoDB.Driver for C#(v2.11.0) 及其相关包,例如 MongoDB.Bson等

之后,我用下面的代码创建了一个Mongo客户端:

MongoClient client = new MongoClient( "mongodb://superuser:12@localhost:27017" );

所以我预计它会抛出异常,因为我使用了错误的密码,在本例中为“12”。 但它没有。然后我尝试列出数据库名称:

client.ListDatabaseNames();

抛出超时异常:“使用 CompositeServerSelector 选择服务器 30000 毫秒后发生超时”

即使我使用了正确的密码或关闭了授权,也只是用“mongodb://localhost:27017”或“mongodb://127.0.0.1 :27017",它仍然抛出相同的超时异常。

感觉它创建的那个客户端有问题导致了后来的超时问题。但是我不知道我错过了什么。

感谢您的帮助!

编辑: 相同的代码在控制台应用程序中完美运行,而不是 windows 表单应用程序,这让我很困惑。

创建客户端不会执行任何网络操作,例如连接到您的 MongoDB 部署 - 这是在后台完成的。因此,不正确的凭据不会导致客户端创建失败。

mongo shell 工作方式不同,Compass 可能会执行一些查询,如果凭据不正确,这些查询可能会失败。

为什么会出现超时错误 - 我猜这是 ipv4/ipv6 的区别。尝试 127.0.0.1 而不是 localhost。如果这不能帮助您在驱动程序中启用调试信息。

mongodb://superuser:12@localhost:27017?authMechanism=SCRAM-SHA-1

因为 dotNet 还不支持 SCRAM-SHA-256

经过 2 天的反复试验,我终于找到了解决此问题的方法,但仍然不知道为什么会这样。

所以基本上我必须将 MongoClient 创建及其后续函数调用分开。创建 MongoClient 后,我​​不能做任何与它相关的事情。例如下面抛出超时异常:

MongoClient client = new MongoClient( "mongodb://localhost:27017" ); //I turned off authorization
client.ListDatabaseNames();  //Throw time out exception here!!!

我必须将它们分别拆分为 2 个函数调用,例如一个在“连接”按钮事件中,另一个在“ListDatabaseNames”按钮事件中。

一旦我这样做了,一切正常。