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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM