ASP.NET Core Web API读取appsettings异常:ArgumentNullException及集合取值失败
问题诊断与修复
核心错误
你的VideoRepository构造函数存在关键逻辑错误:直接通过类名AppDatabaseSettings访问Value,而非使用注入的IOptions<AppDatabaseSettings>实例kickboxerDatabaseSettings。AppDatabaseSettings是普通实体类,本身不存在Value属性——这里混淆了IOptions<T>的Value属性与配置类本身。这种错误会导致读取的是配置类的默认空值(仅在其他正确使用注入实例的场景中,UsersCollectionName能被正确赋值,所以看起来它可正常工作)。
修复步骤
1. 修正VideoRepository构造函数代码
将构造函数中所有AppDatabaseSettings.Value替换为注入实例的Value属性:
public class VideoRepository { private readonly IMongoCollection<Video> _videoCollection; public VideoRepository(IOptions<AppDatabaseSettings> kickboxerDatabaseSettings) { var settings = kickboxerDatabaseSettings.Value; var mongoClient = new MongoClient(settings.ConnectionString); var mongoDatabase = mongoClient.GetDatabase(settings.DatabaseName); _videoCollection = mongoDatabase.GetCollection<Video>(settings.VideosCollectionName); } public async Task Post(Video video) { await _videoCollection.InsertOneAsync(video); } }
2. 确认Program.cs中的配置绑定逻辑
确保已在Program.cs中完成配置绑定与依赖注入注册:
var builder = WebApplication.CreateBuilder(args); // 将AppDatabase节点配置绑定到AppDatabaseSettings builder.Services.Configure<AppDatabaseSettings>( builder.Configuration.GetSection("AppDatabase")); // 注册VideoRepository到DI容器 builder.Services.AddScoped<VideoRepository>(); // 其他中间件与服务配置... var app = builder.Build(); // ...
3. 调试验证配置绑定有效性
若修复后仍有问题,可在构造函数中添加调试输出,确认配置是否正确加载:
public VideoRepository(IOptions<AppDatabaseSettings> kickboxerDatabaseSettings) { var settings = kickboxerDatabaseSettings.Value; // 控制台输出调试信息 Console.WriteLine($"ConnectionString: {settings.ConnectionString}"); Console.WriteLine($"VideosCollectionName: {settings.VideosCollectionName}"); var mongoClient = new MongoClient(settings.ConnectionString); var mongoDatabase = mongoClient.GetDatabase(settings.DatabaseName); _videoCollection = mongoDatabase.GetCollection<Video>(settings.VideosCollectionName); }
补充说明
- 你使用的
null!是空值原谅运算符,仅用于告诉编译器属性不会为null,但配置绑定失败时,属性仍会是空字符串或null,这也是触发ArgumentNullException的原因——MongoDB相关方法不接受空字符串参数。 - ASP.NET Core默认会根据环境自动加载对应配置文件,只要未修改默认配置逻辑,
appsettings.Development.json会被正常加载。
内容的提问来源于stack exchange,提问作者rdsmatheus
相关产品推荐
相关产品推荐

