ASP.NET Core中controller action底层是如何映射到路由的?
ASP.NET Core Controller Action 路由映射学习路径
第一阶段:先搞懂基础端点路由核心逻辑
不要直接切入Controller相关的复杂代码,先从最简端点路由入手理清底层机制:
- 先跑通只有裸端点的路由示例,理解两个核心中间件的分工:
app.UseRouting(); // 负责匹配请求对应的Endpoint对象 app.UseEndpoints(endpoints => { endpoints.MapGet("/test", async context => await context.Response.WriteAsync("Hello World")); }); // 负责执行匹配到的Endpoint关联的处理逻辑 - 搞懂
Endpoint类的核心结构:所有路由规则最终都会被转换成Endpoint实例,里面包含路由模板、元数据、处理委托三个核心部分,全局的所有Endpoint都存在EndpointDataSource集合中供匹配时调用。
第二阶段:理解Controller到Endpoint的转换流程
搞懂基础端点逻辑后,再看MapControllers的核心作用,本质就是把所有Action转换成对应的Endpoint注册到全局集合中:
- 第一步:Action元数据扫描
应用启动时,框架会通过IActionDescriptorProvider扫描所有符合要求的Controller类(继承ControllerBase或标注[ApiController]),把类下的公共可访问方法逐个转换为ActionDescriptor实例,里面存储了Action的路由模板、参数列表、过滤器、允许的HTTP方法等所有元数据。 - 第二步:Action转Endpoint
MapControllers会注册ControllerActionEndpointDataSource,这个数据源会遍历所有生成的ActionDescriptor,通过ActionEndpointFactory把每个Action转换成对应的Endpoint实例,同时绑定Action执行的入口委托,最终加入全局的Endpoint集合。 - 第三步:请求匹配与执行
请求到来时UseRouting中间件会根据请求路径匹配到对应的Controller类型Endpoint,UseEndpoints触发Endpoint绑定的委托,内部通过ControllerActionInvoker完成Controller激活、参数绑定、Action执行、结果处理的全流程。
第三阶段:针对性啃核心代码
不用通读整个aspnetcore仓库,针对性看以下核心组件的实现即可:
ControllerActionEndpointDataSourceFactory:Controller端点数据源的创建逻辑ActionEndpointFactory:ActionDescriptor转Endpoint的具体实现DefaultEndpointSelector:请求匹配时的端点选择逻辑ControllerActionInvoker:Action的执行调度逻辑
调试技巧:启动时给MapControllers方法打断点跟进启动阶段的注册流程,请求时给UseRouting入口打断点跟进匹配流程,比静态读代码更容易理清执行顺序。
内容的提问来源于stack exchange,提问作者Ryan Clements
相关产品推荐
相关产品推荐

