ASP.NET Core端点路由 作用原理
端點路由(Endpoint Routing)最早出現(xiàn)在ASP.NET Core2.2,在ASP.NET Core3.0提升為一等公民。Endpoint Routing的動機
在端點路由出現(xiàn)之前,我們一般在請求處理管道的末尾,定義MVC中間件解析路由。這種方式意味著在處理管道中,MVC中間件之前的中間件將無法獲得路由信息。
路由信息對于某些中間件非常有用,比如CORS、認證中間件(認證過程可能會用到路由信息)。
同時端點路由提煉出端點概念,解耦路由匹配邏輯、請求分發(fā)。
Endpoint Routing中間件
由一對中間件組成:
UseRouting 將路由匹配添加到中間件管道。該中間件查看應用程序中定義的端點集合,并根據(jù)請求選擇最佳匹配。
UseEndpoints 將端點執(zhí)行添加到中間件管道。MapGet、MapPost等方法將 處理邏輯連接到路由系統(tǒng);其他方法將 ASP.NET Core框架特性連接到路由系統(tǒng)。
MapRazorPages for Razor Pages
MapControllers for controllers
MapHub< THub> for SignalR
MapGrpcService< TService> for gRPC
處于這對中間件上游的 中間件:始終無法感知 Endpoint;
處于這對中間件之間的 中間件,將會感知到被匹配的Endpoint,并有能力附加處理邏輯;
UseEndpoints是一個終點中間件;
沒有匹配,則進入UseEndpoints之后的中間件。
放置在UseRouting、UseEndpoints之間的認證授權中間件可以:
感知被匹配的端點信息;在調度到Endpoint之前,應用授權策略。
以上在/health定義了健康檢查,該端點定義了IAuthorizeDatametadata,要求先認證再執(zhí)行健康檢查。
我們在UseRouting、UseEndpoints之間添加一點測試代碼:? 感知端點:
????????????app.Use(next?=>?context?=>{var?endpoint?=?context.GetEndpoint();if?(endpoint?is?null){return?Task.CompletedTask;}Console.WriteLine($"Endpoint:?{endpoint.DisplayName}");if?(endpoint?is?RouteEndpoint?routeEndpoint){Console.WriteLine("Endpoint?has?route?pattern:?"?+routeEndpoint.RoutePattern.RawText);}foreach?(var?metadata?in?endpoint.Metadata){Console.WriteLine($"Endpoint?has?metadata:?{metadata}");}return?next(context);});當請求/healthz時,感知到AuthorizeAttribute metadata
故猜想認證授權中間件要對/healthz起作用,必然會對這個 AuthorizeAttribute metadata有所反應。
于是翻閱GithubAuthorizationMiddleware3.0源碼:發(fā)現(xiàn)請求處理的委托確實關注了Endpoint,并提取了metadata中的IAuthorizeData授權信息。
//?----?截取自https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs----- if?(endpoint?!=?null) {context.Items[AuthorizationMiddlewareInvokedWithEndpointKey]?=?AuthorizationMiddlewareWithEndpointInvokedValue; } var?authorizeData?=?endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>()????Array.Empty<IAuthorizeData>(); var?policy?=?await?AuthorizationPolicy.CombineAsync(_policyProvider,?authorizeData); if?(policy?==?null) {await?_next(context);return; } var?policyEvaluator?=?context.RequestServices.GetRequiredService<IPolicyEvaluator>(); ......測試代碼感知的AuthorizeAttribute確實是實現(xiàn)了IAuthorizeData接口。
bingo, 猜想得到源碼驗證。
結論
端點路由:允許ASP.NET Core應用程序在中間件管道的早期確定要調度的端點, 以便后續(xù)中間件可以使用該信息來提供當前管道配置無法提供的功能。
這使ASP.NET Core框架更加靈活,強化端點概念,它使路由匹配、解析功能與端點調度功能脫鉤。
https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
TPL Dataflow組件應對高并發(fā),低延遲要求
ASP.NET Core跨平臺技術內(nèi)幕
ASP.NET?Core結合Redis實踐消息隊列
Quartz.net在集群環(huán)境下部署任務的姿勢
基于docker-compose的Gitlab CI/CD實踐&排坑指南
總結
以上是生活随笔為你收集整理的ASP.NET Core端点路由 作用原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过 Continual Learnin
- 下一篇: 使用Azure Application