无法使用MongoClient设置作为MongoClient的参数连接到MongoDb

无法使用MongoClient设置作为MongoClient的参数连接到MongoDb,mongodb,azure,mongodb-.net-driver,Mongodb,Azure,Mongodb .net Driver,我正在开发一个C#MVC Web API,它使用MongoDb作为后端 MongoClient mongoClient = new MongoClient(connectionString) 其中connectionstring的格式为:mongodb://Username:Password@hostname.eastus.cloudapp.azure.com Mongo db托管在Azure的虚拟机中。我能够连接到数据库,并且一切正常。但我经常遇到异常: “MongoDb.driver.Mo

我正在开发一个C#MVC Web API,它使用MongoDb作为后端

MongoClient mongoClient = new MongoClient(connectionString)
其中connectionstring的格式为:
mongodb://Username:Password@hostname.eastus.cloudapp.azure.com

Mongo db托管在Azure的虚拟机中。我能够连接到数据库,并且一切正常。但我经常遇到异常:

“MongoDb.driver.MongoConnectionException”。运行时发生异常 接收来自服务器的消息--->System.IO.IOException:无法 从传输连接读取数据:连接尝试失败 因为关联方在一段时间后未作出适当回应 时间,……”

因此,经过一点研究,我了解到Azure正在杀死空闲连接,我必须设置
MaxConnectionIdleTime

为了设置MaxConnectionIdleTime,我决定用以下方式连接Mongodb

 var credential = MongoCredential.CreateCredential("dbname", "UserName", "Password");

 var settings = new MongoClientSettings
 {
     Credentials = new[] { credential },
     Server = new MongoServerAddress("HostName", 27017),
     MaxConnectionIdleTime = new TimeSpan(0, 3, 0)
 };
 MongoClient mongoClient = new MongoClient(settings);
在本例中,我使用的用户名和密码组合与我以前连接的连接字符串中给出的用户名和密码组合相同

在尝试连接此处时,我遇到内部异常:

MongoDB.Driver.MongoAuthenticationException:“无法进行身份验证 使用sasl协议机制“紧急停堆-SHA-1”

“MongoDb.driver.MongoConnectionException”。从服务器接收消息时发生异常---->System.IO.IOException:无法从传输连接读取数据:连接尝试失败,因为连接方在一段时间后没有正确响应

此异常背后的原因是,当托管在Azure中时,Azure尝试终止空闲连接,但C#驱动程序没有意识到这一点。驱动程序尝试在不知道连接不存在的情况下对终止的连接执行查询

我的解决方案是在连接字符串中设置maxIdleTimeMS=45000

这样,驱动程序就不会使用长时间处于空闲状态的连接

这是为我设计的连接字符串


connectionString=“用户名:Password@hostname.eastus.cloudapp.azure.com/?connectTimeoutMS=30000&socketTimeoutMS=30000&waitQueueTimeoutMS=30000&maxIdleTimeMS=45000“

我在Azure托管的MongoDb(Cosmos Db)中遇到类似错误。结果是网络设置导致我阻止了所有访问。将其更改为允许从所有网络“修复了这个问题

这个错误很容易引起误解,我本以为会出现连接超时

使用选择服务器30000ms后发生超时 复合服务器选择器{选择器= MongoDB.Driver.MongoClient+是会话支持的服务器选择器, LatencyLimitingServerSelector{AllowedLatencyRange=00:00:00.0150000 }}.群集状态的客户端视图是{ClusterId:“1”,ConnectionMode :“ReplicaSet”,类型:“ReplicaSet”,状态:“Disconnected”,服务器: [{ServerId:{ClusterId:1,端点: “未指定的/XXXX.documents.azure.com:10255”}”,端点: “未指定的/XXXX.documents.azure.com:10255”,状态:“已断开连接”, 类型:“未知”,异常: “MongoDB.Driver.MongoConnectionException:运行时发生异常 正在打开与服务器的连接。--> MongoDB.Driver.MongoAuthenticationException:无法进行身份验证 使用sasl协议机制SCRAM-SHA-1 MongoDB.Driver.MongoCommand异常:命令saslContinue失败:未执行 已验证

对于Troublhot,我也尝试了MongoDb Compass,但也没有成功,这表明它不是代码