.NET 6 MVC中默认控制器Action的工作原理是什么?
核心原因
你之前的认知基于ASP.NET Core传统MVC约定路由的匹配规则,而示例代码使用的是Web API的属性路由逻辑,两套路由规则相互独立,因此访问路径和预期不符。
- 路由模式差异:示例中控制器标记了
[Route("[controller]")]、Action标记了无参[HttpGet],属于显式属性路由配置,完全不会走传统约定路由的匹配流程。你记忆里「默认Action为Index、URL需要携带Action名」的规则,仅在全局配置了{controller=Home}/{action=Index}/{id?}这类传统约定路由模板,且控制器、Action没有显式标记路由特性时才会生效。另外标记了[ApiController]的控制器默认强制使用属性路由,即使全局配置了传统约定路由,这类控制器也不会走约定匹配逻辑,自然不会默认查找Index方法。 - 属性路由匹配逻辑:控制器级别的
[Route("[controller]")]会将路由基础路径绑定为控制器名移除Controller后缀的结果,即WeatherForecastController对应的基础路径是/weatherforecast。Action上的HTTP方法特性(如[HttpGet]/[HttpPost])如果没有传入自定义路由片段参数,就不会在基础路径后追加额外路径段,只要请求的HTTP方法和特性标记的方法一致,就会匹配到对应Action。
也就是说,发送GET请求到/weatherforecast时,会直接匹配到标记了[HttpGet]的Get()方法,不需要在路径后追加/get。只有当你给HTTP方法特性传入路由片段参数,比如写为[HttpGet("get")]时,访问路径才会变成/weatherforecast/get。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

