端点路由是ASP.NET Core框架中用于管理请求到处理逻辑映射的核心组件,它替代了早期版本的路由系统,将路由匹配和端点执行的逻辑整合到中间件管道中,让整个请求处理流程更加清晰和可扩展。

端点路由的核心概念
要理解端点路由的工作方式,首先需要明确几个核心概念:
- 端点(Endpoint):表示应用中的一个可请求的处理单元,比如一个MVC控制器的Action、一个最小API的处理委托、一个Razor页面的处理方法等,每个端点都包含对应的处理逻辑和元数据信息。
- 路由模式(Route Pattern):用于匹配请求URL的规则,比如
/api/products/{id}这样的模式,可以匹配符合规则的请求路径。 - 路由中间件:负责接收请求,根据注册的路由规则匹配对应的端点,并将请求交给端点执行的中间件组件。
端点路由的工作流程
端点路由的完整工作流程可以分为三个主要阶段,整个过程嵌入在ASP.NET Core的中间件管道中:
1. 路由注册阶段
在应用启动的时候,我们会通过代码注册各类端点和对应的路由规则,这些规则会被保存到路由系统的数据源中。下面是一个最小API的端点注册示例:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 注册端点,路由模式为 /api/hello,处理委托为返回字符串
app.MapGet("/api/hello", () => "Hello from endpoint routing");
// 注册带参数的端点
app.MapGet("/api/products/{id}", (int id) => $"Product id is {id}");
app.Run();
2. 请求匹配阶段
当HTTP请求进入应用的中间件管道后,会经过UseRouting中间件,这个中间件的作用是从请求中提取URL、HTTP方法等信息,然后和之前注册的路由规则进行匹配。如果匹配到对应的端点,会把端点信息存储到当前的HttpContext中;如果没有匹配到,请求会继续往后传递,最终可能返回404响应。
3. 端点执行阶段
匹配到端点之后,请求会到达UseEndpoints中间件,这个中间件会从HttpContext中取出匹配的端点,然后执行端点对应的处理逻辑,将结果返回给客户端。如果前面没有匹配到端点,UseEndpoints中间件不会执行任何处理,请求会继续走后续的中间件。
中间件管道中的位置要求
端点路由相关的两个中间件UseRouting和UseEndpoints在管道中的位置有明确要求,否则会导致路由无法正常工作:
UseRouting需要放在可能依赖路由信息的中间件之前,比如身份认证中间件如果需要获取当前请求的端点信息来做权限校验,就需要放在UseRouting之后。UseEndpoints需要放在UseRouting之后,并且通常放在管道的靠后位置,因为它负责执行端点逻辑,后续一般只有异常处理之类的中间件。
下面是一个正确的中间件顺序示例:
var app = WebApplication.CreateBuilder(args).Build();
// 异常处理中间件,放在最前面捕获整个管道的错误
app.UseExceptionHandler("/error");
// 路由匹配中间件,放在需要路由信息的中间件之前
app.UseRouting();
// 身份认证中间件,依赖路由信息做权限判断,放在UseRouting之后
app.UseAuthentication();
app.UseAuthorization();
// 端点执行中间件,放在最后执行匹配到的端点逻辑
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/api/hello", () => "Hello");
});
app.Run();
自定义路由规则示例
端点路由支持自定义路由模式,满足不同的业务场景需求,比如添加路由约束、设置路由默认值等:
var app = WebApplication.CreateBuilder(args).Build();
// 带路由约束的端点,id必须是数字
app.MapGet("/api/orders/{id:int}", (int id) => $"Order id is {id}");
// 带默认值的路由,当访问 /api/blog 时,category默认是 tech
app.MapGet("/api/blog/{category=tech}", (string category) => $"Category is {category}");
// 正则约束的路由,name只能包含字母
app.MapGet("/api/user/{name:regex(^[a-zA-Z]+$)}", (string name) => $"User name is {name}");
app.Run();
端点路由的优势
相比之前的路由系统,端点路由的优势主要体现在几个方面:
- 路由匹配和执行逻辑整合到中间件管道中,流程更清晰,也方便和其他中间件配合。
- 支持在中间件中获取匹配的端点信息,方便做统一的权限校验、日志记录等操作。
- 对最小API、MVC、Razor页面等多种处理模式都有良好的支持,统一了路由管理的入口。
ASP.NET_Core端点路由路由中间件请求处理中间件管道修改时间:2026-06-24 07:57:17