詳解ASP.NET Core端點路由的作用原理
端點路由(Endpoint Routing)最早出現(xiàn)在ASP.NET Core2.2,在ASP.NET Core3.0提升為一等公民。
Endpoint Routing的動機(jī)
在端點路由出現(xiàn)之前,我們一般在請求處理管道的末尾,定義MVC中間件解析路由。這種方式意味著在處理管道中,MVC中間件之前的中間件將無法獲得路由信息。
路由信息對于某些中間件非常有用,比如CORS、認(rèn)證中間件(認(rèn)證過程可能會用到路由信息)。
同時端點路由提煉出端點概念,解耦路由匹配邏輯、請求分發(fā)。
Endpoint Routing中間件
由一對中間件組成:
UseRouting 將路由匹配添加到中間件管道。該中間件查看應(yīng)用程序中定義的端點集合,并根據(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,并有能力執(zhí)行附加處理邏輯;
UseEndpoint是一個終點中間件;
沒有匹配,則進(jìn)入UseEndpoint之后的中間件。

放置在UseRouting、UseEndpoints之間的認(rèn)證授權(quán)中間件可以:
感知被匹配的端點信息;在調(diào)度到Endpoint之前,應(yīng)用授權(quán)策略。
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,要求先認(rèn)證再執(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);
});
當(dāng)請求/healthz時,感知到AuthorizeAttribute metadata

故猜想認(rèn)證授權(quán)中間件要對/healthz起作用,必然會對這個 AuthorizeAttribute metadata有所反應(yīng)。
于是翻閱GithubAuthorizationMiddleware3.0源碼:發(fā)現(xiàn)確實關(guān)注了Endpoint
// ---- 截取自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接口。
binggo, 猜想得到源碼驗證。
結(jié)論
端點路由:允許ASP.NET Core應(yīng)用程序在中間件管道的早期確定要調(diào)度的端點,
以便后續(xù)中間件可以使用該信息來提供當(dāng)前管道配置無法提供的功能。
這使ASP.NET Core框架更加靈活,強(qiáng)化端點概念,它使路由匹配和解析功能與終結(jié)點分發(fā)功能脫鉤。
到此這篇關(guān)于詳解ASP.NET Core端點路由的作用原理的文章就介紹到這了,更多相關(guān)ASP.NET Core端點路由內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Metalama使用Fabric操作項目或命名空間的問題
Metalama是一個基于微軟編譯器Roslyn的元編程的庫,可以解決我在開發(fā)中遇到的重復(fù)代碼的問題,這篇文章主要介紹了Metalama使用Fabric操作項目或命名空間,需要的朋友可以參考下2022-04-04
理解ASP.NET?Core?錯誤處理機(jī)制(Handle?Errors)
這篇文章主要介紹了理解ASP.NET?Core?錯誤處理(Handle?Errors)?,在這里需要注意的是,與“異常處理”有關(guān)的中間件,一定要盡早添加,這樣,它可以最大限度的捕獲后續(xù)中間件拋出的未處理異常。感興趣的朋友跟隨小編一起看看吧2021-11-11
.Net Core讀取Json配置文件的實現(xiàn)示例
這篇文章主要介紹了.Net Core讀取Json配置文件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Visual Studio 2013如何使XML文件轉(zhuǎn)換成類
Visual Studio 2013如何使XML文件轉(zhuǎn)換成類?這篇文章主要介紹了Visual Studio2013輕松將你的XML文件轉(zhuǎn)換成類的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
ASP.NET Core Zero使用Power Tool工具
這篇文章介紹了ASP.NET Core Zero使用Power Tool工具的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
Web.config(應(yīng)用程序的配置信息)總結(jié)
Web.config文件是一個XML文本文件,它用來儲存 ASP.NET Web 應(yīng)用程序的配置信息(如最常用的設(shè)置ASP.NET Web 應(yīng)用程序的身份驗證方式),它可以出現(xiàn)在應(yīng)用程序的每一個目錄中,接下來詳細(xì)介紹一下配置情況,感興趣的朋友可以了解下2013-01-01
ASP.NET Core文件壓縮常見使用誤區(qū)(最佳實踐)
本文給大家分享ASP.NET Core文件壓縮常見的三種誤區(qū),就每種誤區(qū)給大家講解的非常詳細(xì),是項目實踐的最佳紀(jì)錄,對ASP.NET Core文件壓縮相關(guān)知識感興趣的朋友一起看看吧2021-05-05

