You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core集成MongoDB遇数据库名参数ArgumentException异常求助

问题描述

调用Get接口从MongoDB获取全量数据时触发异常:

System.ArgumentException: 'Database names must be non-empty and not contain '.' or the null character. (Parameter 'databaseName')'

异常发生在ActivityRepository构造函数的var database = mongoclient.GetDatabase(settings.DatabaseName);代码行,appsettings.json中的DatabaseName配置看似正常,但实际未被正确读取。

Activity仓储接口

using Domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Domain.Repositories.Contracts
{
    public interface IActivityRepository
    {
        List<Activity> Get();
        Activity Get(string id);
        Activity Create(Activity activity);
        void Update(string id);
        void Remove(string id);
        void Update(string id, Activity activity);
    }
}

Activity仓储实现类

using Domain.Contexts;
using Domain.Models;
using Domain.Repositories.Contracts;
using MongoDB.Driver;

namespace Domain.Repositories.Mongo
{
    public class ActivityRepository : IActivityRepository
    {
        private readonly IMongoCollection<Activity> _activity;

        public ActivityRepository(IOneboardDtatabaseSettings settings, IMongoClient mongoclient)
        {
            var database = mongoclient.GetDatabase(settings.DatabaseName);
            _activity = database.GetCollection<Activity>(settings.ActivitesCollectionName);
        }
        
        Activity IActivityRepository.Create(Activity activity)
        {
            throw new NotImplementedException();
        }

        public List<Activity> Get()
        {
            return _activity.Find(activity => true).ToList();
        }

        Activity IActivityRepository.Get(string id)
        {
            throw new NotImplementedException();
        }

        void IActivityRepository.Remove(string id)
        {
            throw new NotImplementedException();
        }

        void IActivityRepository.Update(string id)
        {
            throw new NotImplementedException();
        }

        void IActivityRepository.Update(string id, Activity activity)
        {
            throw new NotImplementedException();
        }
    }
}

Program.cs相关配置

using API.Config;
using Domain.Contexts;
using Domain.Repositories.Contracts;
using Domain.Repositories.Mongo;
using Microsoft.Extensions.Options;
using MongoDB.Driver;

var builder = WebApplication.CreateBuilder(args);

/*****************************************
 *      SERVICES
 * **************************************/

// Add services to the container.
builder.Services.Configure<OneboardDatabaseSettings>(
      builder.Configuration.GetSection(nameof(OneboardDatabaseSettings)));


builder.Services.AddSingleton<IOneboardDtatabaseSettings>(sp =>
      sp.GetRequiredService<IOptions<OneboardDatabaseSettings>>().Value);

builder.Services.AddSingleton<IMongoClient>(s =>
     new MongoClient(builder.Configuration.GetValue<string>("OneboardDatabase:ConnectionString")));


builder.Services.AddScoped<IActivityRepository, ActivityRepository>();

builder.Services.AddControllers();


// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

/*****************************************
 *      PIPELINE
 * **************************************/

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

// Global error handling registration
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/error");
}

app.UseCors();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

appsettings.json数据库配置

{
  ...
  "OneboardDatabase": {
    "ActivitesCollectionName": "activities",
    "ConnectionString": "mongodb+srv://Muralidharan:murali123@cluster0.fwttvjg.mongodb.net/?retryWrites=true&w=majority",
    "DatabaseName": "myFirstDatabase"
  }
}

数据库配置接口及实现类

namespace Domain.Contexts
{
    public interface IOneboardDtatabaseSettings
    {
        string ActivitesCollectionName { get; set; }
        string ConnectionString { get; set; }
        string DatabaseName { get; set; }
    }
}
namespace Domain.Contexts
{
    // This class acts as a template for configurations in appsettings file
    public class OneboardDatabaseSettings: IOneboardDtatabaseSettings
    {
        public string ActivitesCollectionName { get; set; } = String.Empty;
        public string ConnectionString { get; set; } = String.Empty;
        public string DatabaseName { get; set; } = String.Empty;
    }
}

原因分析
  1. 配置绑定节不匹配:Program.cs中使用nameof(OneboardDatabaseSettings)获取配置节名称,得到的是"OneboardDatabaseSettings",但appsettings.json中的配置节是"OneboardDatabase",导致配置无法正确绑定到OneboardDatabaseSettings实例,最终DatabaseName为空字符串,触发MongoDB的参数校验异常。
  2. 接口命名拼写错误:IOneboardDtatabaseSettings中的Dtatabase少写了一个字母a(应为Database),属于潜在命名不一致问题,容易引发后续逻辑混淆。
解决方案

1. 修正配置绑定的节名称

修改Program.cs中的配置绑定代码,将配置节指定为appsettings.json中实际的名称:

builder.Services.Configure<OneboardDatabaseSettings>(
      builder.Configuration.GetSection("OneboardDatabase"));

2. 修正接口命名的拼写错误

将IOneboardDtatabaseSettings重命名为IOneboardDatabaseSettings,保持与实现类命名一致:

namespace Domain.Contexts
{
    public interface IOneboardDatabaseSettings
    {
        string ActivitesCollectionName { get; set; }
        string ConnectionString { get; set; }
        string DatabaseName { get; set; }
    }
}

同时更新Program.cs中的注入代码:

builder.Services.AddSingleton<IOneboardDatabaseSettings>(sp =>
      sp.GetRequiredService<IOptions<OneboardDatabaseSettings>>().Value);

以及ActivityRepository构造函数的参数类型:

public ActivityRepository(IOneboardDatabaseSettings settings, IMongoClient mongoclient)
{
    var database = mongoclient.GetDatabase(settings.DatabaseName);
    _activity = database.GetCollection<Activity>(settings.ActivitesCollectionName);
}

3. 验证配置读取(可选)

可在Program.cs中添加调试代码确认配置是否正确读取:

var settings = builder.Configuration.GetSection("OneboardDatabase").Get<OneboardDatabaseSettings>();
Console.WriteLine($"DatabaseName: {settings.DatabaseName}"); // 预期输出:myFirstDatabase

内容的提问来源于stack exchange,提问作者Muralidharan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:54:22