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

时间:2016-11-05 09:41:41

标签: mongodb azure mongodb-.net-driver

我正在开发一个使用MongoDb作为后端的C#MVC Web API。我尝试使用

连接到我的mongodb数据库
MongoClient mongoClient = new MongoClient(connectionString)

其中connectionstring的格式为:mongodb://Username:Password@hostname.eastus.cloudapp.azure.com

Mongo数据库托管在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协议机制SCRAM-SHA-1“。

2 个答案:

答案 0 :(得分:1)

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

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

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

这样驱动程序就不会使用长时间闲置的连接。

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

的connectionString ="用户名:?Password@hostname.eastus.cloudapp.azure.com/ connectTimeoutMS = 30000&安培; socketTimeoutMS = 30000&安培; waitQueueTimeoutMS = 30000&安培; maxIdleTimeMS = 45000"

答案 1 :(得分:0)

我在Azure托管的MongoDb(Cosmos Db)上遇到了类似的错误。原来是网络设置,因此我阻止了所有访问。将其更改为“允许从“所有网络”访问”可以解决此问题。

该错误非常容易引起误解,我希望连接超时。

  

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

要解决问题,我也尝试从MongoDb Compass尝试,但也没有用,向我证明这不是代码。