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