.net core 2.x到3.x变化 -> Endpoint Routing
路由定义:负责匹配传入的HTTP请求,并将这些请求分发到应用程序的可执行终结点。路由使用“终结点”(Endpoint
) 来表示应用中的逻辑终结点
Endpoint: 是应用程序的可执行请求处理代码的单位,在应用程序中定义,并且在应用程序启动时配置,终结点匹配过程可以从请求的url中提取值,并且将这些值提供给请求处理
终结点路由:路由终结点具有模板、元数据以及为终结点响应提供服务的请求委托,由使用两个扩展方法与中间件集成
1.UseRouting 向中间件管道添加路由匹配。必须在任何路由感知中间件(授权,终结点执行等)之前 ,作用:根据当前请求找到endpoint
2.UseEndpoints 向中间件管道添加终结点 作用:根据endpoint去执行请求的最终处理,也就是找到具体的action方法
官方示例代码
public void Configure(IApplicationBuilder app) { // Matches request to an endpoint. app.UseRouting(); // Endpoint aware middleware. // Middleware can use metadata from the matched endpoint. app.UseAuthorization(); // Execute the matched endpoint. app.UseEndpoints(endpoints => { // Configuration of app endpoints. endpoints.MapRazorPages(); endpoints.MapGet("/", context => context.Response.WriteAsync("Hello world")); endpoints.MapHealthChecks("/healthz"); }); }
介绍了前面的基础知识,那么究竟3.x之后为啥要引入endpoint 路由系统呢?
在2.x版本,一个请求到响应的过程是这样的:
接收到请求后,通过一系列中间件管道事件,最终由route中间件把http请求和路由数据发送到mvc的router handler里,然后由mvc路由handler把请求与路由数据进行匹配,也就是匹配controller中的action方法进行处理请求,然后router中间件就会执行选中的action方法生成响应,最终响应原路返回到客户端。
那么在3.x之后的变化:
Endpoint routing 由2个中间件组成,也就是上面的Endpoint Routing和Endpoint 也就是对应上面的UseRouting 和UseEndpoints
为啥要这么干呢???
白话:但是这样的话其实会对执行router中间件之前的中间件来说是不友好的,比如授权中间件不能提前知道该请求会被哪个action方法执行,同时更好与mvc进行区分,解耦
官方说明:
- 终结点和中间件与其他基于 ASP.NET Core 的技术(例如运行状况检查)进行良好的编排。
- 终结点可以在中间件和 MVC 中实现各种策略,例如 CORS 或者授权等
- 过滤器和特性 (attribute) 可以被放置在控制器的方法上。
参考文档:
https://mp.weixin.qq.com/s/ptFa4-s6PVgPU-qB7XRXWg