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>();
        }
原文地址:https://www.cnblogs.com/jasontarry/p/15382899.html