ASP.NET Core端点路由 作用原理
端點(diǎn)路由(Endpoint Routing)最早出現(xiàn)在ASP.NET Core2.2,在ASP.NET Core3.0提升為一等公民。Endpoint Routing的動(dòng)機(jī)
在端點(diǎn)路由出現(xiàn)之前,我們一般在請(qǐng)求處理管道的末尾,定義MVC中間件解析路由。這種方式意味著在處理管道中,MVC中間件之前的中間件將無法獲得路由信息。
路由信息對(duì)于某些中間件非常有用,比如CORS、認(rèn)證中間件(認(rèn)證過程可能會(huì)用到路由信息)。
同時(shí)端點(diǎn)路由提煉出端點(diǎn)概念,解耦路由匹配邏輯、請(qǐng)求分發(fā)。
Endpoint Routing中間件
由一對(duì)中間件組成:
UseRouting 將路由匹配添加到中間件管道。該中間件查看應(yīng)用程序中定義的端點(diǎn)集合,并根據(jù)請(qǐng)求選擇最佳匹配。
UseEndpoints 將端點(diǎn)執(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
處于這對(duì)中間件上游的 中間件:始終無法感知 Endpoint;
處于這對(duì)中間件之間的 中間件,將會(huì)感知到被匹配的Endpoint,并有能力附加處理邏輯;
UseEndpoints是一個(gè)終點(diǎn)中間件;
沒有匹配,則進(jìn)入U(xiǎn)seEndpoints之后的中間件。
放置在UseRouting、UseEndpoints之間的認(rèn)證授權(quán)中間件可以:
感知被匹配的端點(diǎn)信息;在調(diào)度到Endpoint之前,應(yīng)用授權(quán)策略。
以上在/health定義了健康檢查,該端點(diǎn)定義了IAuthorizeDatametadata,要求先認(rèn)證再執(zhí)行健康檢查。
我們?cè)赨seRouting、UseEndpoints之間添加一點(diǎn)測試代碼:? 感知端點(diǎn):
????????????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);});當(dāng)請(qǐng)求/healthz時(shí),感知到AuthorizeAttribute metadata
故猜想認(rèn)證授權(quán)中間件要對(duì)/healthz起作用,必然會(huì)對(duì)這個(gè) AuthorizeAttribute metadata有所反應(yīng)。
于是翻閱GithubAuthorizationMiddleware3.0源碼:發(fā)現(xiàn)請(qǐng)求處理的委托確實(shí)關(guān)注了Endpoint,并提取了metadata中的IAuthorizeData授權(quán)信息。
//?----?截取自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確實(shí)是實(shí)現(xiàn)了IAuthorizeData接口。
bingo, 猜想得到源碼驗(yàn)證。
結(jié)論
端點(diǎn)路由:允許ASP.NET Core應(yīng)用程序在中間件管道的早期確定要調(diào)度的端點(diǎn), 以便后續(xù)中間件可以使用該信息來提供當(dāng)前管道配置無法提供的功能。
這使ASP.NET Core框架更加靈活,強(qiáng)化端點(diǎn)概念,它使路由匹配、解析功能與端點(diǎn)調(diào)度功能脫鉤。
https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
TPL Dataflow組件應(yīng)對(duì)高并發(fā),低延遲要求
ASP.NET Core跨平臺(tái)技術(shù)內(nèi)幕
ASP.NET?Core結(jié)合Redis實(shí)踐消息隊(duì)列
Quartz.net在集群環(huán)境下部署任務(wù)的姿勢(shì)
基于docker-compose的Gitlab CI/CD實(shí)踐&排坑指南
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core端点路由 作用原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过 Continual Learnin
- 下一篇: 使用Azure Application