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”按钮事件中。
一旦我这样做了,一切正常。
我刚开始使用 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”按钮事件中。
一旦我这样做了,一切正常。