【问题标题】:Trouble connecting to mLab MongoDB from c#从 c# 连接到 mLab MongoDB 时出现问题
【发布时间】:2016-10-22 09:33:58
【问题描述】:

从 c# 连接到 mongo(在远程服务器上)的最佳方式是什么?

到目前为止的故事

尝试从连接到 mongo 实验室的非常基本的 c# 控制台应用程序中进行简单查找,我已经没有尽头了。

我能够使用 Mongo Shell 和 RoboMongo 进行连接并查询我设置的集合。但是我仍然不能对我的 c# 代码做同样的事情——即使我使用的是完全相同的凭据。主要是每当我尝试对我在数据库中设置的集合实际执行查找时,它就会超时。

那里的所有帮助信息/示例/等都太旧了,无法使用。

我正在使用 mLabs mongo 连接模板 - 非常标准的东西

mongodb://<dbuser>:<dbpassword>@<serverName>.mlab.com:<port>/<databaseName>

并且做非常标准的事情来尝试从集合中读取 - 但不行,它总是超时。隐藏在返回的异常中的是对身份验证失败的引用。并检查各种对象,我可以看到其中一个与身份验证相关的成员是空白的。

所以要重申这个问题 - 使用 c# 连接到远程 mongo 存储库的最佳方式是什么? 如果它包括处理所有好东西的最佳实践,例如,奖励积分。集群、复制集等。

【问题讨论】:

    标签: c# mongodb mlab database


    【解决方案1】:

    演练:

    我已经在 mongo labs (www.mlab.com) 上设置了一个帐户,并且能够通过他们的 Web UI 成功连接到该帐户。

    我创建了一个数据库,然后尝试使用 mongo shell 和 robomongo 连接到它 - 没有成功。

    经过大量挖掘,我找到了简单的答案 - 我需要创建一个额外的用户并授予该用户对数据库的特定访问权限。并使用该用户的凭据访问数据库。

    所以我做了所有这些,现在我可以使用 Mongo shell 和 RoboMongo 连接到数据库并查询集合。

    但我仍然无法使用我的 c# 代码进行查询——完全相同的凭据(包括大小写)——但我在尝试执行查找时遇到了超时。

    我最终发现了这个: http://stackoverflow.com/questions/30758668/how-to-get-connection-status-in-the-c-sharp-mongodb-driver-v2-0 它给了我一个线索,让我在创建客户端时尝试使用MongoClientSettings 而不是MongoUrl。 我想出了这段代码:

      var credential = MongoCredential.CreateCredential(DatabaseName, UserName, Password);
    
      var mongoClientSettings = new MongoClientSettings
      {
        Server = new MongoServerAddress(serverAddress, Port),
        Credentials = new List<MongoCredential> {credential}
      };
    

    并且当我使用此表单中的凭据创建客户端时它起作用了。

    奇怪的是,既然我已经成功使用了 MongoClientSettings,我可以重新使用 MongoUrl - 就好像 mLabs/mongo 服务器端的一些突出价值终于被正确默认了。

    每个步骤的完整调用块如下所示:

      var mongoClientSettings = BuildMongoClientSettings();
      var client = ClientConnection(mongoClientSettings);
      var database = DatabaseConnection(client, DatabaseName);
      var collection = CollectionConnection(database, CollectionName);
      var data = collection.Find(_ => true).ToList(); // yes I know it's not async - that comes next
    

    所有的方法都很标准,但这里是合集的一个:

    private static IMongoCollection<BsonDocument> CollectionConnection(IMongoDatabase database, string collectionName)
    {
      var collection = database.GetCollection<BsonDocument>(collectionName);
    
      return collection;
    }
    

    【讨论】:

      【解决方案2】:

      查看以下链接:

      1) MongoDB uri (c#) : MongoURI

      2) Mlab(MongoDB 在线托管):mlab.com

      完成托管数据库的过程后,您可以使用以下代码在线测试您的数据库:

      try
      {
          string connectstring1 = "mongodb://user1:password1@ds*****.mlab.com:234***/dbname";
          MongoClient client = new MongoClient(connectstring1);
          var db = client.GetDatabase("dbname");
          var collection = db.GetCollection<BsonDocument>("collectionName");
          var filter1 = Builders<BsonDocument>.Filter.Empty;
          var filter = new BsonDocument();
          using (var cursor = await collection.FindAsync(filter))
          {
              while (await cursor.MoveNextAsync())
              {
                  var batch = cursor.Current;
                  foreach (var document in batch)
                  {
                      MessageBox.Show(document[1].ToString(), "msg");
                  }
              }
          }
      }
      catch(Exception ex)
      {
          MessageBox.Show(ex.Message);
      }
      

      【讨论】:

        【解决方案3】:

        我正在尝试使用任务类将数据插入 MongoDB。但有些 MongoDB 类已被弃用。

         public class Task
            {
                [BsonId(IdGenerator = typeof(CombGuidGenerator))]
                public Guid ID { get; set; }
        
                [BsonElement("Artist")]
                public string Name { get; set; }
        
                [BsonElement("Song")]
                public string Song { get; set; }
          }
        
        public void CreateTask(Task task)
                {
                    MongoCollection<Task> collection = GetTaskCollection();
        
                    try
                    {
                        collection.Insert(task);
        
                    }
                    catch(MongoCommandException ex)
                    {
        
                      string message = ex.Message;
                    }
                }
        
                private void insert_Click(object sender, EventArgs e)
                {
        
                    string name = txtBxName.Text;
                    string song = txtBxSong.Text;
        
                    Task t = new Task
                    {
        
                        Name = name,
        
                        Song = song
                    };
                    Dal d = new Dal();
        
                    List<Task> list = new List<Task>(200);
                    list.Add(t);
        
                    data.DataSource = list;
                }
        

        【讨论】:

          【解决方案4】:

          在阅读 @Lee-H 的好答案之前,我一直在努力连接到我的 mLab MongoDB。以下是我为 Web API 控制器的基类编写的代码。显然,您可以根据需要将其直接放入控制器中:

          public abstract class CtrlBase : ApiController
          {
              private IMongoDatabase _db = null;
              protected IMongoDatabase DB
              {
                  get
                  {
                      if (_db == null)
                      {
                          var cred = MongoCredential.CreateCredential("user", "password");
                          var sett = new MongoClientSettings
                          {
                              Server = new MongoServerAddress("server", <port>),
                              Credentials = new List<MongoCredential> { cred }
                          };
                          var client = new MongoClient(sett);
                          _db = client.GetDatabase("dbName");
                      }
                      return _db;
                  }
              }
          
              protected IMongoCollection<Thing> Things
              {
                  get { return DB.GetCollection<Thing>("mythings"); }
              }
          
          }
          

          请注意,我并没有像@Lee-H 所说的那样恢复通过嵌入密码的连接字符串进行连接,所以我还没有验证如果我切换回去它会以这种方式工作,因为它会让我恼火.尽管如此,@Lee-H 说它开始为他工作。

          祝你好运。

          【讨论】:

            猜你喜欢
            • 2021-01-04
            • 1970-01-01
            • 2021-02-01
            • 2017-08-27
            • 1970-01-01
            • 1970-01-01
            • 2019-01-12
            • 2019-05-05
            • 2021-09-07
            相关资源
            最近更新 更多