ASP.NET Core路由分约定式和特性路由两种,前者在Program.cs中全局配置,适用于MVC页面应用,如MapControllerRoute定义{controller=Home}/{action=Index}/{id?};后者通过[Route]等属性在控制器或方法上直接设置,更灵活,适合RESTful API,如[HttpGet("api/[controller]")];可混合使用,MapControllers()启用特性路由,约定路由处理其余请求;支持路由约束如{id:int}、{name:alpha}及可选参数{id?},合理组合避免冲突,现代项目推荐以特性路由为主。

在 ASP.NET Core 中,路由(Routing)是将传入的 HTTP 请求映射到控制器中的具体操作方法的过程。它决定了 URL 如何被解析和处理。ASP.NET Core 提供了两种主要方式来配置路由:约定式路由(Conventional Routing)和特性路由(Attribute Routing)。了解它们的区别和使用场景,有助于构建清晰、可维护的 Web API 或 MVC 应用。
约定式路由(Conventional Routing)
约定式路由是在应用启动时通过全局模式定义的,通常在 Program.cs 或 Startup.cs 中配置。它适用于传统的 MVC 模式,强调统一的 URL 结构。
例如,在 Program.cs 中添加如下代码:
builder.Services.AddControllersWithViews();var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
上述配置表示:
- 默认访问 /Home/Index
- URL 格式为:/Controller/Action/Id
- Id 是可选参数
这种模式适合页面驱动的应用,如后台管理系统,URL 规律性强,易于维护。
特性路由(Attribute Routing)
特性路由通过在控制器或操作方法上使用属性来定义路由,更加灵活,特别适合构建 RESTful 风格的 Web API。
启用特性路由只需在控制器上添加 [Route] 特性:
[ApiController][Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet] // GET: api/products
public IActionResult Get() => Ok(new[] { "product1", "product2" });
[HttpGet("{id}")] // GET: api/products/5
public IActionResult GetById(int id) => Ok($"Product {id}");
[HttpPost] // POST: api/products
public IActionResult Create([FromBody] string name) => CreatedAtAction(nameof(GetById), new { id = 1 }, name);
}
关键点:
- [controller] 自动替换为控制器名称(去掉 Controller 后缀)
- 支持组合使用类级别和方法级别的路由
- 可精确控制每个端点的 URL 路径和 HTTP 方法
混合使用约定与特性路由
你可以在同一个项目中同时使用两种方式。MVC 页面用约定路由,API 接口用特性路由。
确保调用 MapControllers() 来启用特性路由:
app.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapControllers(); // 启用所有使用 [ApiController] 和路由特性的控制器
这样,带特性的控制器会优先按属性路由匹配,其余走默认约定。
路由约束与可选参数
无论是哪种方式,都可以添加约束来限制参数格式:
- {id:int} —— 只匹配整数
- {name:alpha} —— 只匹配字母
- {date:datetime} —— 匹配日期时间
- {id?} —— 表示参数可选
例如:
[HttpGet("users/{id:int:min(1)}")]public IActionResult GetUser(int id)
{
// 只接受大于等于1的整数 id
}
基本上就这些。根据项目类型选择合适的路由方式:页面为主的系统可用约定式,API 服务推荐特性路由,现代项目往往以特性路由为主,更直观、可控。不复杂但容易忽略的是顺序和组合使用的方式,合理配置才能避免冲突。










