详解ASP.NET Core端点路由的作用原理 |
|
端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民 。 Endpoint Routing的动机 在端点路由出现之前,我们一般在请求处理管道的末尾,定义MVC中间件解析路由 。这种方式意味着在处理管道中,MVC中间件之前的中间件将无法获得路由信息 。 路由信息对于某些中间件非常有用,比如CORS、认证中间件(认证过程可能会用到路由信息) 。 同时端点路由提炼出 Endpoint Routing中间件 由一对中间件组成: UseRouting 将路由匹配添加到中间件管道 。该中间件查看应用程序中定义的端点集合,并根据请求选择最佳匹配 。UseEndpoints 将端点执行添加到中间件管道 。 MapGet、MapPost等方法将 处理逻辑连接到路由系统; 其他方法将 ASP.NET Core框架特性连接到路由系统 。
处于这对中间件上游的 中间件: 始终无法感知 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!");
});
});
}
以上在 我们在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);
});
当请求
故猜想认证授权中间件要对 于是翻阅Github
// ---- 截取自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>();
......
而 binggo, 猜想得到源码验证 。 结论 端点路由:允许ASP.NET Core应用程序在中间件管道的早期确定要调度的端点, 这使ASP.NET Core框架更加灵活,强化端点概念,它使路由匹配和解析功能与终结点分发功能脱钩 。 https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs 到此这篇关于详解ASP.NET Core端点路由的作用原理的文章就介绍到这了,更多相关ASP.NET Core端点路由内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! |