2016-06-21 20 views
2

Was ist der beste Weg, um Verbindung zu Mongo (auf einem Remote-Server) von C#?Probleme beim Verbinden mit mLab MongoDB von C#

Geschichte bisher

Ich habe versucht, kein Ende des Ärgers hat einen einfachen Fund aus einer sehr einfachen C# Konsolenanwendung zu tun Verbindungslabors Mongo.

Ich konnte mit Mongo Shell und RoboMongo verbinden und die Sammlung abfragen, die ich eingerichtet hatte. Aber ich konnte mit meinem C# -Code immer noch nicht dasselbe tun - obwohl ich genau dieselben Zugangsdaten verwendete. In erster Linie war es Zeitüberschreitung, wenn ich versuchte, einen Fund gegen die Sammlung, die ich in der Datenbank eingerichtet hatte, auszuführen.

Alle Hilfe Informationen/Beispiele/etc. da draußen ist Waaaaaaaaaaaaay zu alt, um nützlich zu sein.

Ich verwende mLabs Mongo Verbindung template - ziemlichen Standard

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

Und sehr Standard Dinge zu tun, aus der Sammlung zu versuchen und lesen - aber nicht gehen, es aus immer mal. In der zurückgegebenen Ausnahme war ein Verweis auf die Authentifizierung fehlgeschlagen. Und das Überprüfen der verschiedenen Objekte, die ich sehen konnte, dass für eines der authentifizierungsbezogenen Mitglieder leer war.

Also um die Frage neu zu stellen - was ist der beste Weg, um eine Verbindung zu einem Remote-Mongo-Repository mit C#? Bonuspunkte, wenn es Best Practice für die Handhabung aller guten Sachen, z.B. Cluster, Replikation Sätze usw.

Antwort

3

Begehbare durch:

Ich habe ein Konto bei Mongo Labs (www.mlab.com) und ich bin in der Lage, erfolgreich eine Verbindung zu ihm aufgebaut über ihre Webbenutzeroberfläche

Ich habe eine Datenbank erstellt und dann versucht, es mit der Mongo-Shell und Robomongo zu verbinden - kein Erfolg.

Nach viel herum Graben fand ich die einfache Antwort - ich musste einen zusätzlichen Benutzer schaffen und diesem Benutzer spezifischen Zugang zur Datenbank geben. Verwenden Sie die Anmeldeinformationen dieses Benutzers, um auf die Datenbank zuzugreifen.

Also tat ich das alles und jetzt kann ich mit der Mongo Shell und RoboMongo eine Verbindung zur Datenbank herstellen und die Sammlung abfragen.

Aber ich konnte immer noch nicht mit meinem C# -Code abfragen - genau die gleichen Anmeldeinformationen (einschließlich Fall) - aber ich habe gerade Auszeiten wenn versucht, einen Fund auszuführen.

Schließlich fand ich dieses: http://stackoverflow.com/questions/30758668/how-to-get-connection-status-in-the-c-sharp-mongodb-driver-v2-0 und es gab mir einen Anhaltspunkt MongoClientSettings zu versuchen, zu verwenden, wenn der Client statt MongoUrl zu schaffen. kam ich mit diesem Stück Code oben:

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

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

und es funktionierte, als ich die Anmeldeinformationen in dieser Form verwenden den Client zu erstellen.

Seltsamerweise jetzt, dass ich mit einem MongoClientSettings gelungen bin, bin ich in der Lage, wieder zu verwenden MongoUrl - es ist, als ob einige herausragende Wert auf der mLabs/Mongo-Server Seite der Dinge endlich ordnungsgemäß eingestellt wurde.

Der vollständige Block von Anrufen für jeden Schritt wie folgt aussieht:

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 

Alle Methoden sind ziemlich Standard, aber hier ist die eine für die Sammlung:

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

    return collection; 
} 
2

Sehen Sie sich die Links unten:

1) MongoDB uri (C#): MongoURI

2) Mlab (Online-Hosting für MongoDB): mlab.com

Nach Abschluss des Prozesses Ihre Datenbank von Hosting, können Sie Ihre Online-Datenbank mit dem folgenden Code testen:

try 
{ 
    string connectstring1 = "mongodb://user1:[email protected]*****.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); 
} 
0

Ich kämpfte mit Anschluss an meine mLab MongoDB bis ich @ Lee-Hs gute Antwort gelesen habe. Der folgende Code ist so, wie ich ihn für die Basisklasse meines Web-API-Controllers geschrieben habe. Offensichtlich können Sie diese direkt in Ihrem Controller werfen, je nach Bedarf:

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"); } 
    } 

} 

Bitte beachte, dass ich nicht zu verbinden über ein Passwort eingebetteten Verbindungszeichenfolge hat zufällt als @ Lee-H, sagte er, so habe ich nicht überprüft dass es so funktionieren würde, wenn ich zurückwechsle, weil es mich irritieren würde, das zu lernen. Trotzdem, @ Lee-H sagt, dass es so für ihn funktioniert hat.

Viel Glück.

0

Ich versuche, Daten in MongoDB mithilfe der Task-Klasse einzufügen. Einige MongoDB-Klassen sind jedoch veraltet.

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; 
     }