其他分享
首页 > 其他分享> > .Net Core 路由处理

.Net Core 路由处理

作者:互联网

  用户请求接口路由,应用返回处理结果。应用中如何匹配请求的数据呢?为何能如此精确的找到对应的处理方法?今天就谈谈这个路由。路由负责匹配传入的HTTP请求,将这些请求发送到可以执行的终结点。终结点在应用中进行定义并且在应用启动的时候进行配置,也就是在中间件中进行处理。

路由基础知识

优惠券 https://www.fenfaw.cn/   在项目新建的时候都会自动生成路由相关代码。在 Startup.Configure中的中间件管道注册的。主要涉及到的则是 UseRoutingUseEndpoints中间件。      UseRouting向中间件添加路由匹配。此中间件还会查看应用中定义的终结点集。也就是把应用中的路由统统注册到中间件管道,方便请求的时候进行匹配。      UseEndpoints向中间件添加终结点执行。会运行相关联的委托。简单将就是路由匹配之后的处理事件运行。
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }

 

  例如上面的代码就是 HTPP GET 请求并且Url是/的时候需要执行的委托、如果这里的请求不是 Get请求或者不是"/",那么没有路由匹配,则会返回404。同时指定匹配模式的还有 MapDelete、MapMethods、MapPost、MapPut、Map等。

终结点

  上面讲的 MapGet或者未用到 MapPost等就是用于定义终结点的。它们都包含有两个参数,一个是用于 Url匹配的,另外一个就是需要执行的委托。这里在不一样的应用中都采用了不同的终结点定义方法   那么我们如果需要使用到了授权模块将如何处理呢,终结点也有相对应的处理方式。下面就展示将授权中间件和路由一起使用, MapHealthChecks添加运行状况检查终结点。后面跟着的 RequireAuthorization则是将授权策略添加到端点。   
           app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapHealthChecks("/healthz").RequireAuthorization();
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });

 

  而且我们看中间的使用顺序, UseAuthentication、UseAuthorization是穿插在 UseRoutingUseEndpoints中间的,如此写法则是为了授权策略能在 UseRouting中查找终结点,但是能在 UseEndpoints发送到终结点执行之前应用所选择的授权策略

终结点元数据

  上面的示例展示了运行状况检查终结点附加了授权策略。添加的授权策略是额外数据,也就是终结点元数据。   上面提到元数据可以是人意的.NET类型,那么具体到底是什么呢?元数据如何使用呢?
         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.Use(next => context =>
            {
                var endpoint = context.GetEndpoint();
                if (endpoint?.Metadata.GetMetadata<AuditPolicyAttribute>()?.NeedsAudit ==true)
                {
                    Console.WriteLine("开始处理事务逻辑");
                    Console.WriteLine($"ACCESS TO SENSITIVE DATA AT: {DateTime.UtcNow}");
                }
                return next(context);
            });

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello world!");
                });

                // Using metadata to configure the audit policy.
                endpoints.MapGet("/sensitive", async context =>
                {
                    await context.Response.WriteAsync($"sensitive data{DateTime.UtcNow}");
                })
                .WithMetadata(new AuditPolicyAttribute(needsAudit: true));
            });
        }
    }

    public class AuditPolicyAttribute : Attribute
    {
        public AuditPolicyAttribute(bool needsAudit)
        {
            NeedsAudit = needsAudit;
        }

        public bool NeedsAudit { get; }
    }
  看上面的示例中,在终结点绑定 "/sensitive"的时候会附加元数据 WithMetadata。当访问“/”的时候会输出 "Hello world!"。但是在 app.Use中并不会执行输出"处理事务逻辑",因为并没有匹配的元数据。但是当执行 "/sensitive"的时候就会输出 Console.WriteLine("开始处理事务逻辑");。因为在终结点定义的时候添加了元数据。元数据可以是人意.NET类型。上面的元数据也是我们自定义 Class

比较终端中间件和路由

  上面我们使用app.Use来检测匹配元数据,如果匹配成功我们就执行对应的操作。我们称之为终端中间件,为什么是终端中间件呢,因为这里会停止搜索执行匹配和操作、最后返回。   那么相比较下终端中间件和路由有什么区别呢?

标签:Core,Index,app,中间件,Net,endpoints,public,路由
来源: https://blog.csdn.net/weixin_48967543/article/details/115574369