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; } }
原因分析
- 配置绑定节不匹配:Program.cs中使用
nameof(OneboardDatabaseSettings)获取配置节名称,得到的是"OneboardDatabaseSettings",但appsettings.json中的配置节是"OneboardDatabase",导致配置无法正确绑定到OneboardDatabaseSettings实例,最终DatabaseName为空字符串,触发MongoDB的参数校验异常。 - 接口命名拼写错误:
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
相关产品推荐
相关产品推荐

