.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进行区分,解耦

官方说明:

  1.   终结点和中间件与其他基于 ASP.NET Core 的技术(例如运行状况检查)进行良好的编排。
  2.  终结点可以在中间件和 MVC 中实现各种策略,例如 CORS 或者授权等
  3.     过滤器和特性 (attribute) 可以被放置在控制器的方法上。

 

参考文档:

https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-3.0?view=aspnetcore-3.1#endpoint-routing

https://mp.weixin.qq.com/s/ptFa4-s6PVgPU-qB7XRXWg

posted @ 2020-03-25 17:47  hkf  阅读(241)  评论(0编辑  收藏  举报