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

 更新时间:2020年07月13日 11:13:17   作者:有态度的小码甲  
这篇文章主要介绍了详解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框架特性连接到路由系统。

  • MapRazorPages for Razor Pages
  • MapControllers for controllers
  • MapHub< THub> for SignalR
  • MapGrpcService< TService> for gRPC

处于这对中间件上游的 中间件: 始终无法感知 Endpoint;
处于这对中间件之间的 中间件,将会感知到Endpoint,并有能力执行附加处理逻辑;
UseEndpoint是一个终点中间件;
没有匹配,则进入UseEndpoint之后的中间件。


放置在UseRoutingUseEndpoints之间的认证授权中间件可以:
感知被匹配的端点信息;在调度到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,要求先认证再执行健康检查。

我们在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源码:发现确实关注了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确实是实现了IAuthorizeData接口。

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端点路由内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Metalama使用Fabric操作项目或命名空间的问题

    关于Metalama使用Fabric操作项目或命名空间的问题

    Metalama是一个基于微软编译器Roslyn的元编程的库,可以解决我在开发中遇到的重复代码的问题,这篇文章主要介绍了Metalama使用Fabric操作项目或命名空间,需要的朋友可以参考下
    2022-04-04
  • 理解ASP.NET Core 错误处理机制(Handle Errors)

    理解ASP.NET Core 错误处理机制(Handle Errors)

    这篇文章主要介绍了理解ASP.NET Core 错误处理(Handle Errors) ,在这里需要注意的是,与“异常处理”有关的中间件,一定要尽早添加,这样,它可以最大限度的捕获后续中间件抛出的未处理异常。感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • asp.net获取HTML表单File中的路径的方法

    asp.net获取HTML表单File中的路径的方法

    这篇文章主要介绍了asp.net怎么获取HTML表单File中的路径,需要的朋友可以参考下
    2014-02-02
  • asp.net 上传大文件解决方案

    asp.net 上传大文件解决方案

    asp.net 上传大文件解决方案...
    2007-04-04
  • asp.net mvc core管道及拦截器的理解

    asp.net mvc core管道及拦截器的理解

    这篇文章主要给大家介绍了关于asp.net mvc core管道及拦截器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用asp.net mvc core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • .Net Core读取Json配置文件的实现示例

    .Net Core读取Json配置文件的实现示例

    这篇文章主要介绍了.Net Core读取Json配置文件的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Visual Studio 2013如何使XML文件转换成类

    Visual Studio 2013如何使XML文件转换成类

    Visual Studio 2013如何使XML文件转换成类?这篇文章主要介绍了Visual Studio2013轻松将你的XML文件转换成类的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • ASP.NET Core Zero使用Power Tool工具

    ASP.NET Core Zero使用Power Tool工具

    这篇文章介绍了ASP.NET Core Zero使用Power Tool工具的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • Web.config(应用程序的配置信息)总结

    Web.config(应用程序的配置信息)总结

    Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中,接下来详细介绍一下配置情况,感兴趣的朋友可以了解下
    2013-01-01
  • ASP.NET Core文件压缩常见使用误区(最佳实践)

    ASP.NET Core文件压缩常见使用误区(最佳实践)

    本文给大家分享ASP.NET Core文件压缩常见的三种误区,就每种误区给大家讲解的非常详细,是项目实践的最佳纪录,对ASP.NET Core文件压缩相关知识感兴趣的朋友一起看看吧
    2021-05-05

最新评论