无法通过C#客户端连接到MongoDB(MongoLabs)

问题背景:

我在MongoLabs(mLab – https://mlab.com/ )中设置了一个数据库并添加了一个非常简单的Collection。 我正在使用MongoDB驱动程序尝试通过C#3.2驱动程序连接和使用此集合。

问题:

我无法通过C#驱动程序连接到我的数据库,并且持续进行身份validation,如下所示:

System.TimeoutException:使用CompositeServerSelector选择服务器30000ms后出现超时{Selectors = ReadPreferenceServerSelector {ReadPreference = {Mode = Primary,TagSets = []}},LatencyLimitingServerSelector {AllowedLatencyRange = 00:00:00.0150000}}。 群集状态的客户端视图是{ClusterId:“1”,ConnectionMode:“Automatic”,类型:“Unknown”,状态:“Disconnected”,服务器:[{ServerId:“{ClusterId:1,EndPoint:”Unspecified / ds048719。 mlab.com:48719“}”,EndPoint:“未指定/ ds048719.mlab.com:48719”,状态:“已断开连接”,类型:“未知”,HeartbeatException:“MongoDB.Driver.MongoConnectionException:打开时发生exception连接到服务器.—. MongoDB.Driver.MongoAuthenticationException:无法使用sasl协议机制SCRAM-SHA-1进行身份validation.—> MongoDB.Driver.MongoCommandException:命令saslStart失败:身份validation失败。

代码:

我尝试了许多尝试validation请求的不同方法。 目前我正在尝试简单地使用MongoClient类,如下所示:

 MongoClient client; var connectionString = "mongodb://userNameGoesHereRemovedForSO:passwordGoesHereRemovedForSO@ds048555.mlab.com:48719/db"; client = new MongoClient(connectionString); var database = client.GetDatabase("testDB"); var collection = database.GetCollection("test"); 

任何有关如何成功克服此身份validation问题的帮助或示例都将受到高度赞赏。

如果我不得不冒险猜测,问题很可能是防火墙问题。 你应该检查以下内容

  • 来自C#Application Host的主机nslookup (ds048719.mlab.com)
  • 从C#应用程序主机ping主机(ds048719.mlab.com)(可能会失败,具体取决于mLab的设置)
  • 您的IP地址已列入白名单
  • 使用运行C#应用程序的同一主机上的Mongo Shell测试连接。 mLab有文档。
  • 使用原始telnet测试连接,例如telnet ds048719.mlab.com 48719
  • 确保您使用的是正确的authenticationDatabase (在您的示例中,这是由/db指定的),这通常是admin但如果您位于共享实例上,则可能是您的数据库名称。

您可以在MongoDB C#驱动程序文档中找到与C#驱动程序连接的文档 。 请务必注意以下事项:

数据库组件

数据库组件是可选的,用于指示要进行身份validation的数据库。 如果未提供数据库组件,则使用“admin”数据库。

mongodb://host:27017/mydb

上面,名为“mydb”的数据库是为应用程序存储凭据的位置。

注意:

某些驱动程序利用数据库组件来指示默认使用哪个数据库。 .NET驱动程序在解析数据库组件时,不会将数据库组件用于除身份validation之外的任何其他操作。

最后,我建议将来在发布到SO时模糊主机名和端口。 虽然通过默默无闻的安全性是一个糟糕的政策,但它肯定会为您的MongoDB部署增加一层防御。

您的连接字符串可能不正确。 你有/ db的结尾,“db”是你认证数据库的名字吗?

确保您的身份validation数据库正确。 如果不是,您可能希望将它们全部一起删除,然后让它回退到管理员