我正在开发一个使用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“。
答案 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尝试,但也没有用,向我证明这不是代码。