ASP.NET Core 路由需通过 MapControllerRoute 等方法注册到 EndpointRouting 管道,常见问题源于注册位置错误或 UseRouting/UseEndpoints 顺序颠倒;.NET 6+ 废弃 UseMvc,应改用 AddControllersWithViews() 和 MapControllers()。

ASP.NET Core 项目里,路由不是靠“配置”出来的,而是靠 MapControllerRoute 或 MapAreaControllerRoute 这类方法注册进 EndpointRouting 管道的——写错位置、漏掉 UseEndpoints(或 UseRouting/UseEndpoints 顺序颠倒)是 90% 的“路由不生效”问题根源。
为什么 app.UseMvc() 在 .NET 6+ 里直接报错?
.NET 6 起默认启用 Minimal Hosting 模型,UseMvc 已被移除,且 Startup.cs 不再强制存在。继续沿用旧教程里的 services.AddMvc() + app.UseMvc() 会触发编译失败或运行时 404。
- ✅ 正确做法:在
Program.cs中调用builder.Services.AddControllersWithViews()(带视图)或AddControllers()(纯 API) - ✅ 终端中间件必须是
app.MapControllers()(推荐)或显式app.UseRouting(); app.UseEndpoints(...) - ❌ 不要手动调用
UseMvc,也不要在ConfigureServices里注册MvcOptions后不配对应中间件
MapControllerRoute 的三个参数分别控制什么?
典型注册:endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
- 第一个参数
"default"是路由名,仅用于生成 URL(如Url.Action("Index", "Home")),不影响匹配逻辑 - 第二个参数是模板字符串:
{controller}和{action}是占位符,必须与控制器/动作方法名完全一致(大小写敏感);{id?}的?表示可选,但不会自动设为null,需在 Action 参数上加[FromRoute]或设默认值 - 第三个参数(可选)是
defaults或constraints字典:比如new { area = "Admin" }可绑定到 Area,new { id = @"\d+" }可约束 id 必须为数字
API 控制器返回 404,但 curl /weatherforecast 却能通?
这是典型的控制器命名或路由注册遗漏问题:
- 确认控制器类名以
Controller结尾(如ProductsController),否则MapControllerRoute不识别 - 确认 Action 方法是
public且非static;若用了[NonAction]或private会被跳过 - 检查是否误用了
[ApiController]但没配AddControllersWithViews()—— 它要求参数绑定严格,默认禁用FromBody以外的模型绑定,可能让 GET 请求因参数解析失败而静默 404 - 用
app.MapControllers()时,它只扫描带[Route]或继承ControllerBase的类;纯class+[HttpGet]不行,必须是Controller或ControllerBase子类
真正卡住人的往往不是语法,而是路由注册时机(必须在 UseRouting 之后、UseEndpoints 之前)和控制器基类选择——Controller 支持 View,ControllerBase 更轻量但不支持 View();混用会导致编译通过但运行时报 InvalidOperationException: The view 'xxx' was not found。










