ASP.Net Core MongoCSharpDriver 2.7 дБ является нулевым в .GetDatabase - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать короткий POC ASP.Net WebAPI, который подключается к моему кластеру Mongo Atlas.У меня уже есть рабочий API Node / Koa Rest, который подключается и работает отлично.Однако я не могу подключить этот ASP.Net Core MongoCSharpDriver 2.7.В последующем коде контроллера, когда он пытается выполнить _db.GetCollection ("user"). FindAll (), _db всегда имеет значение null

Можете ли вы увидеть, что мне не хватает и / илиопубликовать пример кода, который у вас работает?

const string DB_NAME = "easymessagebus";
const string DB_URL = "mongodb://**user**:**pass**@cluster0-shard-00-00-dhbdk.mongodb.net:27017,cluster0-shard-00-01-dhbdk.mongodb.net:27017,cluster0-shard-00-02-dhbdk.mongodb.net:27017/" + DB_NAME + "?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true";
const string COLL_NAME = "user";
MongoClient _client;
MongoDatabase _db;
public UserData()
{
    _client = new MongoClient(DB_URL);
    _db = _client.GetDatabase(DB_NAME) as MongoDatabase;
}
...

Я могу только предположить, что мой URL-адрес соединения должен быть каким-то образом изменен, но почему код не вызывает ошибку соединения?

1 Ответ

0 голосов
/ 28 октября 2018

Таким образом, _db, являющийся нулевым, и отладочный прогон, не выдающий никакой ошибки, кроме "_db is null ..." (да, это не полезно), мне пришлось довольно долго использовать Google для этого.

После долгих поисков я наконец нашел код, который дал ключ к окончательному решению моей проблемы.На самом деле это была не связь, а попытка получить данные.Вы ДОЛЖНЫ обернуть все свои методы контроллера и dataRepo / dataContext в асинхронные задачи .

Вот рабочий класс UserData для тех, кто ищет это позже ...

UserData.cs

public class UserData
{
    private readonly IMongoClient _mongoClient;
    private readonly IMongoDatabase _database;
    private readonly IMongoCollection<User> _collection;

    public UserData(string mongoUri)
    {
        _mongoClient = new MongoClient(mongoUri);
        _database = _mongoClient.GetDatabase("easymessagebus");
        _collection = _database.GetCollection<User>("user");
    }

    public async Task<IEnumerable<User>> GetAll()
    {
        return await _collection.Find(Builders<User>.Filter.Empty).ToListAsync();
    }

...

UserController.cs

[ApiController]
[Produces("application/json")]
[Route("api/user")]
public class UserController : ControllerBase
{
    private readonly UserData userData = null;

    public UserController(string mongoUri)
    {
        userData = new UserData(mongoUri);
    }

    // GET api/values
    [HttpGet]
    public async Task<ActionResult<IEnumerable<string>>> Get()
    {
        var values = await userData.GetAll();
        return new JsonResult(values);
    }

...

ПРИМЕЧАНИЕ. Убедитесь, что ваш appsettings.json содержит правильную строку MongoDb Uri.Кроме того, убедитесь, что ваш Startup.cs передает URI MongoDb в конструктор контроллера, например ...

Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        var mongoUri = Configuration["MongoUri_Atlas"];
        if (!string.IsNullOrWhiteSpace(mongoUri))
        {
            services.AddSingleton<string>(mongoUri);
        }
    }

...
...