zoukankan      html  css  js  c++  java
  • UseRouting() 和 UseEndpoints()的执行流程

    UseRouting() 将请求与端点匹配,路由规则
    UseEndpoints()执行匹配的端点

    UseRouting 去匹配路由  UseEndpoints 找出mvc 的所有特性 方法 控制  去执行路由。

    微软之所以这样设计2个中间件,是为了更好的扩展,比如我们之前aspnet mvc   有了路由匹配我们就直接执行了, 拆分这2个中间件的好处,最经典的还是鉴权、授权,我们在这中间件之间,添加另外的流程。我们知道了 contrler +action+特性,我们可以还没达到mvc 的流程,先做一波鉴权授权,这样大大提高了程序的性能,节省了资源。所以net core 在中间件中的鉴权授权的位置一定在routing 和endpoint 之间了。

     现在执行

    UseRouting的EndpointRoutingMiddleware的中间件只是委托,不是真正执行 后面执行UseEndpoints()的EndpointMiddleware 写入规则
    在bulid 的时候去真正执行中间件 顺序是
    EndpointMiddleware=====》EndpointRoutingMiddleware

     services.addmvc()会扫描所有的dll

         app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllerRoute(
                        name: "default",
                        pattern: "{controller=Filter}/{action=Index}/{id?}");
                });
    MapControllerRoute  的方法 会把所有控制的类型全部找出来

     

    public static IApplicationBuilder UseRouting(this IApplicationBuilder builder)
            {
    
                if (builder == null)
                {
                    throw new ArgumentNullException(nameof(builder));
                }
    
                //在调用UseEndpoint之前验证AddRouting服务是否已完成        //我们使用RoutingMarkerService来确保是否添加了所有服务。   
                VerifyRoutingServicesAreRegistered(builder);
    
             //初始化数据源
                var endpointRouteBuilder = new DefaultEndpointRouteBuilder(builder);
    
                builder.Properties[EndpointRouteBuilder] = endpointRouteBuilder;
    
                //操作完成后对此实例引用
                return builder.UseMiddleware<EndpointRoutingMiddleware>(endpointRouteBuilder);
            }
    public static IApplicationBuilder UseEndpoints(this IApplicationBuilder builder, Action<IEndpointRouteBuilder> configure)
            {
                if (builder == null)
                {
                    throw new ArgumentNullException(nameof(builder));
                }
    
                if (configure == null)
                {
                    throw new ArgumentNullException(nameof(configure));
                }
    
                
                //在调用UseEndpoint之前验证AddRouting服务是否已完成       //我们使用RoutingMarkerService来确保是否添加了所有服务。        //AddRouting服务在Program类的ConfigureWebHostDefaults调用后添加。
                //所以在调用UseEndpoint之前 必须要先调用UseRouting,否则报错。
                VerifyRoutingServicesAreRegistered(builder);
    
               //验证端点路由中间件是否已注册
                VerifyEndpointRoutingMiddlewareIsRegistered(builder, out var endpointRouteBuilder);
    
               
                configure(endpointRouteBuilder);
    
                //我们正在将数据源注册到一个全局集合中
                //可用于发现端点或生成URL。
                //每个中间件都有自己的数据源集合,所有这些数据源也
                //被添加到全局集合中。
                var routeOptions = builder.ApplicationServices.GetRequiredService<IOptions<RouteOptions>>();
                foreach (var dataSource in endpointRouteBuilder.DataSources)
                {
                    routeOptions.Value.EndpointDataSources.Add(dataSource);
                }
    
                //操作完成后对此实例引用
                return builder.UseMiddleware<EndpointMiddleware>();
            }
  • 相关阅读:
    特殊方法(双下方法)
    反射
    属性
    类方法、静态方法
    封装
    python接口类,抽象类
    Yii2基本概念之——事件(Event)
    Yii2基本概念之——行为(Behavior)
    yii2 migrate 数据库迁移的简单分享
    Yii2.0 RESTful API 之速率限制
  • 原文地址:https://www.cnblogs.com/jasontarry/p/15382899.html
Copyright © 2011-2022 走看看