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>(); }