日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core端点路由 作用原理

發(fā)布時間:2023/12/4 asp.net 101 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core端点路由 作用原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

端點路由(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之前,應用授權策略。

    public?void?Configure(IApplicationBuilder?app,?IWebHostEnvironment?env) {if?(env.IsDevelopment()){app.UseDeveloperExceptionPage();}//?Matches?request?to?an?endpoint.app.UseRouting();//?Endpoint?aware?middleware.?//?Middleware?can?use?metadata?from?the?matched?endpoint.app.UseAuthentication();app.UseAuthorization();//?Execute?the?matched?endpoint.app.UseEndpoints(endpoints?=>{//?Configure?the?Health?Check?endpoint?and?require?an?authorized?user.endpoints.MapHealthChecks("/healthz").RequireAuthorization();//?Configure?another?endpoint,?no?authorization?requirements.endpoints.MapGet("/",?async?context?=>{await?context.Response.WriteAsync("Hello?World!");});}); }

    以上在/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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。