.NET 6 WebApplicationFactory测试客户端控制器未映射返回404问题
问题根因
这个问题的核心原因是集成测试环境下MVC控制器的应用部件(Application Part)加载缺失,和你查到的Program类访问权限问题不是一类:
- 直接启动应用时,程序入口就是你的API项目程序集,
AddControllers()默认会自动把入口程序集加入控制器扫描列表,能正常发现所有控制器,所以接口访问没问题。 - 跑集成测试时,xUnit测试运行器的程序集才是入口程序集,
AddControllers()默认只会扫描测试入口程序集里的控制器,不会自动把你的API项目程序集加进扫描范围;而你手动写的MapGet最小API、SOAP接口都是显式注册的端点,不需要靠扫描程序集发现,所以能正常访问。 - 其余正常迁移的项目,要么是配置时提前加载了API程序集,要么是显式注册过应用部件,所以没触发这个问题。
修复方法
修改ConfigureServices()里注册控制器的代码,显式把API项目自身的程序集加入应用部件列表就行:
builder.Services.AddControllers(opt => opt.AddGlobalErrorHandling()) // 显式注册当前API程序集为控制器扫描源 .AddApplicationPart(typeof(Program).Assembly); builder.Services.AddSoapCore();
如果你的控制器是放在独立的类库里,把对应类库的程序集用同样方式加进去即可。
要是改完还没恢复,可以临时在ConfigureApp()里加段调试代码,打印所有已注册的端点,确认控制器路由是否真的加载成功:
app.Use(async (context, next) => { var dataSource = app.Services.GetRequiredService<EndpointDataSource>(); foreach (var ep in dataSource.Endpoints) { Console.WriteLine($"已注册端点:{ep.DisplayName}"); } await next(); });
内容的提问来源于stack exchange,提问作者ScottishTapWater
相关产品推荐
相关产品推荐

