路由是C# ASP.NET Core应用中负责将HTTP请求映射到对应处理程序的核心机制,它决定了应用如何响应不同URL和HTTP方法的请求,是连接客户端请求和服务器端逻辑的重要桥梁。
路由的核心作用
ASP.NET Core的路由主要完成两项核心工作:一是根据请求的URL和HTTP方法匹配预定义的路由规则,二是将匹配到的请求转发到对应的处理端点,比如控制器中的Action方法或者最小API的处理委托。
路由的工作依赖于两个核心组件:路由中间件和端点。路由中间件负责解析请求信息并匹配路由规则,端点则是具体的请求处理逻辑,两者配合完成请求的路由分发。
路由的配置方式
传统路由
传统路由通常在Startup类的Configure方法中通过app.UseRouting()和app.UseEndpoints()配合定义,适合基于控制器的应用场景。以下是一个典型的传统路由配置示例:
// 在Configure方法中配置路由
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 启用路由中间件
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// 定义默认路由规则,匹配 /控制器/Action/参数 的格式
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
上述代码中,路由模板{controller=Home}/{action=Index}/{id?}表示:如果没有指定控制器,默认使用Home控制器;没有指定Action,默认使用Index方法;id参数是可选的。
特性路由
特性路由通过在控制器或者Action方法上添加[Route]特性来定义路由规则,优先级高于传统路由,适合需要精细化控制路由的场景。示例如下:
using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
public class UserController : ControllerBase
{
// 匹配 GET /api/user 请求
[HttpGet]
public IActionResult GetAllUsers()
{
return Ok(new[] { "用户1", "用户2" });
}
// 匹配 GET /api/user/1 请求,id是路径参数
[HttpGet("{id}")]
public IActionResult GetUserById(int id)
{
return Ok($"用户ID:{id}");
}
}
路由模板的常见语法
路由模板中支持多种语法来定义参数和约束,常见的语法规则如下:
{参数名}:定义必填的路径参数,比如{id}表示匹配URL中对应位置的参数{参数名?}:定义可选的路径参数,比如{id?}表示该参数可以不出现在URL中{参数名:约束类型}:对参数添加类型约束,比如{id:int}表示id参数必须是整型[controller]、[action]:在特性路由中自动替换为当前控制器名和Action名
以下是一个带参数约束的路由示例,只有id为整型的请求才会被匹配:
[Route("product/{id:int}")]
public IActionResult GetProduct(int id)
{
return Ok($"产品ID:{id}");
}
路由匹配的常见场景
处理不同HTTP方法
通过[HttpGet]、[HttpPost]等特性可以限定路由只匹配对应的HTTP方法,避免不同操作的路由冲突。
[Route("api/order")]
public class OrderController : ControllerBase
{
// 只匹配 POST 请求
[HttpPost]
public IActionResult CreateOrder()
{
return Ok("订单创建成功");
}
// 只匹配 PUT 请求
[HttpPut("{id}")]
public IActionResult UpdateOrder(int id)
{
return Ok($"订单{id}更新成功");
}
}
区域路由
对于大型应用,可以使用区域来划分功能模块,区域路由需要在传统路由中配置区域模板:
app.UseEndpoints(endpoints =>
{
// 配置区域路由,匹配 /区域/控制器/Action/参数 的格式
endpoints.MapAreaControllerRoute(
name: "admin",
areaName: "Admin",
pattern: "Admin/{controller=Home}/{action=Index}/{id?}");
});
对应的控制器需要添加[Area("Admin")]特性标识所属区域。
路由的注意事项
路由的匹配顺序是按照定义的先后顺序排列的,先定义的路由规则会被优先匹配,因此更具体的路由规则应该放在更通用的规则之前。另外,路由参数的值可以通过HttpContext.GetRouteData()方法获取,也可以在Action方法的参数中直接接收,框架会自动完成参数绑定。
理解路由的工作原理和配置方式,能够帮助开发者更灵活地设计API接口和页面路由,避免请求匹配错误的问题,提升应用的请求处理效率。
ASP.NET_Core路由中间件端点路由模板修改时间:2026-06-12 12:48:23