ASP.NET 6中GetRequiredSection集成测试执行顺序异常的解决方法
问题解决方案
核心原因
你当前代码的问题在于配置读取时机错误:先执行了builder.Build()完成应用构建,之后才去读取builder.Configuration。而集成测试中通过ConfigureAppConfiguration添加的内存配置,是在宿主构建过程中生效的,Build完成后配置已经固化,此时读取的还是初始配置,自然找不到MySettings节触发异常。
可行解决方案(无需替换GetRequiredSection)
方案1:将配置读取移到builder.Build()之前
把读取配置的代码提前到构建应用实例之前,确保集成测试的配置修改能被加载:
var builder = WebApplication.CreateBuilder(args); // 提前读取配置,确保集成测试的修改生效 var mySettingSection = builder.Configuration.GetRequiredSection("MySettings"); var mySettingValue = mySettingSection["MyKey"]; var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.MapGet("/", (Func<string>)(() => $"Hello, your setting value is: {mySettingValue}")); app.Run();
方案2:延迟配置读取到请求处理阶段
如果不想提前读取配置,可以在每次请求处理时动态读取配置,这样能确保获取到最新的配置(包括集成测试注入的内容):
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 在请求触发时才读取配置 app.MapGet("/", () => { var mySettingSection = app.Configuration.GetRequiredSection("MySettings"); var mySettingValue = mySettingSection["MyKey"]; return $"Hello, your setting value is: {mySettingValue}"; }); app.Run();
内容的提问来源于stack exchange,提问作者Q-bertsuit
相关产品推荐
相关产品推荐

