• NetCore路由的Endpoint模式


        IdentityServer里有各种Endpoint,如TokenEndpoint,UserInfoEndpoint,Authorize Endpoint,Discovery Endpoint等等。Endpoint从字面意思来看是“终端节点"或者“终节点”的意思。无独有偶NetCore的路由也有Endpoint的概念。那么我们提出一个问题来,究竟什么是Endpoint?

        先来看一段代码,如下所示:

        

     View Code

    上面的代码很清晰,如果路由格式匹配”weather/{city}/{year}.{month}.{day}”,那么就调用WeatherForecast方法,这里的app.UseRouting().UseEndpoints就用到了Endpoint模式。要了解Endpoint,我们需要抽丝剥茧一步一步了解几个类的方法:

       1.我们先看最里面的endpoints =>endpoints.MapGet("weather/{city}/{year}.{month}.{day}", WeatherForecast),这里实际上调用的是EndpointRouteBuilderExtensions类的MapGet方法,代码如下所示:

     View Code

    在这里我们重点看看下面签名的方法:

     View Code

    在这个方法里有一个实例化RouteEndpointBuilder的语句:

      var builder = new RouteEndpointBuilder(
                    requestDelegate,
                    pattern,
                    defaultOrder)
                {
                    DisplayName = pattern.RawText ?? pattern.DebuggerToString(),
                };

    其中RouteEndpointBuilder从字面意思看得出,就是RouteEndpoint的创建者,我们看下它的代码:

     View Code

    再来看下Endpoint的代码:

     View Code

    从Build()方法看得出,它利用路由匹配的RoutePattern,生成一个RouteEndpoint实例。RouteEndpoint叫做路由终点,继承自Endpoint。Endpoint有一个重要的RequestDelegate属性,用来处理当前的请求。看到这里,我们开始推断:所谓的Endpoint,无非就是用要匹配的pattern,构造一个RouteEndpoint的过程,其中RouteEndpoint继承自Endpoint。NetCore无非就是利用这个RouteEndpoint来匹配当前的Url,如果匹配得上,就执行RequestDelegate所代表的方法,上文就是WeatherForecast方法,如果匹配不上,则不执行WeatherForecast方法,仅此而已。

      2.为了验证,我们再来看 app.UseRouting().UseEndpoints(),实际上调用的是EndpointRoutingApplicationBuilderExtensions类的两个方法:

     View Code

       2-1首先看UseRouting()方法,这个方法其实就是调用EndpointRoutingMiddleware中间件进行Endpoint的匹配,我们可以看下它的几个方法:

      

     View Code

    Invoke方法看得出来,它根据当前的HttpContext进行Endpoint的匹配,如果当前的HttpContext路由格式匹配成功,那么将当前HttpContext传递给下一个中间件处理,这个从SetRoutingAndContinue方法看得出来。

     2-2其次看下UseEndpoints()方法,这个方法就是调用EndpointMiddleware中间件,对上面匹配成功的HttpContext进行处理,并调用HttpContext的EndPoint的RequestDelegate处理当前请求。我们重点看下它的Invoke方法,重点关注var requestTask = endpoint.RequestDelegate(httpContext):

     View Code

      总结:从上面的分析,我们粗略的了解了netcore路由的Endpoint模式其实就是一种用匹配模式构建的终端节点,它主要用来对HttpContext进行路由的匹配,如果匹配成功,则执行Endpoint上的RequestDelegate方法。

  • 相关阅读:
    springboot+websocket+vue聊天室
    【附源码】计算机毕业设计SSM商店管理系统
    有些东西你要是早点懂,也不至于走那么多冤枉路
    基于element UI 实现大文件分片上传
    用羊羊来告诉你:如何用python进行APP抓包
    Linux命令(83)之cut
    [创业-44]:《从员工到老板,你必须经历的三次跃迁》解读
    ES6 入门教程 21 async 函数 21.1 含义 & 21.2 基本用法
    No.10软件设计
    鲁棒的非负监督低秩鉴别嵌入算法
  • 原文地址:https://blog.csdn.net/jh035/article/details/128090575