核心端点路由在ASP。网中的作用有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
端点路由(端点路由)最早出现在ASP。净Core2.2,在ASP。净Core3.0提升为一等公民。
在端点路由出现之前,我们一般在请求处理管道的末尾,定义MVC中间件解析路由。这种方式意味着在处理管道中,MVC中间件之前的中间件将无法获得路由信息。
路由信息对于某些中间件非常有用,比如歌珥,认证中间件(认证过程可能会用到路由信息)。
同时端点路由提炼出<代码>端点代码>概念,解耦路由匹配逻辑,请求分发。
由一对中间件组成:
UseRouting将路由匹配添加到中间件管道。该中间件查看应用程序中定义的端点集合,并根据请求选择最佳匹配.UseEndpoints将端点执行添加到中间件管道。
MapGet, MapPost等方法将处理逻辑连接到路由系统;
其他方法将ASP。核心网框架特性连接到路由系统。
- <李> MapRazorPages剃刀页面李> <李> MapControllers为控制器李> <李> MapHub
处于这对中间件上游的中间件:始终无法感知端点;
处于这对中间件之间的中间件,将会感知到端点,并有能力执行附加处理逻辑;
UseEndpoint是一个终点中间件;
没有匹配,则进入UseEndpoint之后的中间件。
放置在<代码> UseRouting 代码>,<代码> UseEndpoints 代码>之间的认证授权中间件可以:
感知被匹配的端点信息;在调度到端点之前,应用授权策略。
公共空间配置(IApplicationBuilder应用,IWebHostEnvironment env) { 如果(env.IsDevelopment ()) { app.UseDeveloperExceptionPage (); }//匹配端点的请求。 app.UseRouting ();//端点意识到中间件。//中间件可以使用元数据匹配的端点。 app.UseAuthentication (); app.UseAuthorization ();//执行匹配端点。 app.UseEndpoints(端点=比; {//配置健康检查端点,需要一个授权用户。 endpoints.MapHealthChecks (“/healthz") .RequireAuthorization ();//配置另一个端点,没有授权需求。 endpoints.MapGet(“/?异步上下文=比; { 等待context.Response.WriteAsync (“Hello World !”); }); }); }
以上在<代码>/代码>健康定义了健康检查,该端点定义了<代码> IAuthorizeData> 代码的元数据,要求先认证再执行健康检查。
我们在UseRouting, UseEndpoints之间添加一点口水代码:感知端点:
app.Use(下=比;上下文=比; { var端点=context.GetEndpoint (); 如果端点为空) { 返回Task.CompletedTask; } Console.WriteLine($“端点:{endpoint.DisplayName}“); 如果端点RouteEndpoint RouteEndpoint) { Console.WriteLine(“端点路由模式:“+ routeEndpoint.RoutePattern.RawText); } foreach (var endpoint.Metadata元数据) { Console.WriteLine($“端点有元数据:{元数据}“); } 返回下一个(上下文); });
当请求<代码>/healthz> 代码时,感知到<代码> AuthorizeAttribute> 代码的元数据
故猜想认证授权中间件要对<代码>/healthz> 代码起作用,必然会对这个<代码> AuthorizeAttribute> 代码的元数据有所反应。
于是翻阅Github <代码> AuthorizationMiddleware 代码> 3.0源码:发现确实关注了端点
//- - - - -截取自https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs----- 如果(端点!=null) { 上下文。项目(AuthorizationMiddlewareInvokedWithEndpointKey)=AuthorizationMiddlewareWithEndpointInvokedValue; } var authorizeData=https://www.yisu.com/zixun/endpoint& # 63; .Metadata.GetOrderedMetadata() & # 63; & # 63;Array.Empty (); var=等待AuthorizationPolicy政策。CombineAsync (_policyProvider authorizeData); 如果(政策==null) { 等待_next(上下文); 返回; } var policyEvaluator=context.RequestServices.GetRequiredService (); ……
而<代码> AuthorizeAttribute 代码>确实是实现了<代码> IAuthorizeData 代码>接口。
binggo,猜想得到源码验证。