ASP.NET Core3.X 终端中间件转换为端点路由运行

引言

前几天.NET Core3.1发布,于是我把公司一个基础通用系统升级了,同时删除了几个基础模块当然这几个基础模块与.NET Core3.1无关,其中包括了支付模块,升级完后静文(同事)问我你把支付删除了啊?我说是啊,没考虑好怎么加上(感觉目前不太好,我需要重新设计一下)。

故事从这开始

考虑支付的时候我考虑的是将支付sdk如何直接引入到系统,以及可以有一系列支付的路由,我需要考虑的是如果创建响应给指定的地址,so我开始想如何达到我的目的自定义个中间件,Use、Run、Map???

路由的进阶

路由负责将请求 URI 映射到终结点并向这些终结点调度传入的请求。 路由在应用中定义,并在应用启动时进行配置。 路由可以选择从请求包含的 URL 中提取值,然后这些值便可用于处理请求。 通过使用应用中的路由信息,路由还能生成映射到终结点的 URL。

在ASP.NET Core 2.1和更低版本中,路由是通过实现将IRouter传入的URL映射到处理程序的接口来处理的。通常,将直接依赖MvcMiddleware添加到中间件管道末端的实现,而不是直接实现该接口。一旦请求到达MvcMiddleware,便会应用路由来确定传入请求URL路径所对应的控制器和操作。

然后,该请求在执行处理程序之前经过了各种MVC筛选器。这些过滤器形成了另一条“管道”,让人联想到中间件管道,并且在某些情况下必须复制某些中间件的行为。一个典型的例子就是CORS政策。为了对每个MVC操作以及中间件管道的其他“分支”实施不同的CORS策略,内部需要进行一定程度的重复。

“分支”中间件管道通常用于“伪路由”。如Map()在中间件管道中的扩展方法,将允许您在传入路径具有给定前缀时有条件地执行某些中间件。

如下所示:

       app.Map("/order", app => app.Run(async context =>
              {
                  await context.Response.WriteAsync("Order");
              })
            );

在这种情况下,该Run()方法是“终端”中间件,因为它返回响应。但是从某种意义上说,整个Map分支对应于应用程序的“端点”.

在ASP.NET Core 2.2中,引入了终结点路由作为MVC控制器的新路由机制。此实现本质上是的内部实现MvcMiddleware .

在ASP.NET Core 2.x中使用Map()

下面我们自定义一个中间件,该中间件返回直接返回一个相应而不是继续往下执行调用_next委托,一个很基本的中间件。

    public class ApiEndpointMiddleware
    {
        private readonly RequestDelegate _next;

        public ApiEndpointMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {

            context.Response.StatusCode = 200;

            await context.Response.WriteAsync("Order");
        }

    }

在ASP.NET Core 2.x中,可以通过使用扩展方法指定路由访问该中间件,从而将其包含在Startup.cs的中间件管道中

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles();

    app.Map("/order", app => app.UseMiddleware<ApiEndpointMiddleware>()); versionApp.UseMiddleware<VersionMiddleware>()); 

    app.UseMvcWithDefaultRoute();
}

当我们访问 /order 或者 /order/1 路由都会得到自定义中间件返回的相应。

将中间件转换为端点路由

在ASP.NET Core 3.0中,我们使用端点路由,因此路由步骤与端点的调用是分开的。实际上,这意味着我们有两个中间件:

  • EndpointRoutingMiddleware 实际的路由,即计算将为指定的请求URL路径调用哪个端点。
  • EndpointMiddleware 所有调用的端点。

它们在中间件管道中的两个不同点处添加,因为它们起着两个不同的作用。一般而言,我们想的是路由中间件提前在管道中,以便后续的中间件可以访问有关将执行的端点的信息。端点的调用应在管道的末端进行。

如下所示:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

        }
        

该UseRouting()扩展方法添加EndpointRoutingMiddleware到管道,同时将UseEndpoints()扩展方法添加EndpointMiddleware到管道。UseEndpoints()实际上为应用程序注册所有端点的位置。

那么如何将我们自定义中间件使用端点路由来映射呢?

从概念上讲,我们UseEndpoints()使用/OrderURL作为匹配的路径,将“order”端点的注册移动到调用中:

         endpoints.MapControllers();
                endpoints.Map("/order",endpoints.CreateApplicationBuilder()
                .UseMiddleware<ApiEndpointMiddleware>().Build()).WithDisplayName("order-api");

在我们上面针对ASP.NET Core 2.x的实现中,我们将匹配/order,/order/123等端点路由

例如:

endpoints.Map("/order/{action}",null);

这将同时匹配 /order /order/1,但不匹配/order/status/1。它比以前的版本功能强大得多.

在上一个示例中,我们提供了一个显示名称(主要用于调试目的),但是我们可以附加其他的信息,例如授权策略或CORS策略,其他中间件可以查询这些信息。例如:

     app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.Map("/order/{action}",endpoints.CreateApplicationBuilder()
                .UseMiddleware<ApiEndpointMiddleware>().Build()).WithDisplayName("order-api").RequireCors("AllowAllHosts")
            .RequireAuthorization("AdminOnly");
            });

我们向端点添加了CORS策略(AllowAllHosts)和授权策略(AdminOnly)。当到达端点的请求到达时,并在执行端点之前采取相应的措施。

参考

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-3.1#endpoint-routing-differences-from-earlier-versions-of-routing

原文地址:https://www.cnblogs.com/yyfh/p/12010232.html

时间: 2024-11-01 20:40:42

ASP.NET Core3.X 终端中间件转换为端点路由运行的相关文章

了解ASP.NET Core端点路由

原作者Areg Sarkissian 介绍 在这篇文章中,我将说明从版本2.2开始已添加到ASP.NET Core中间件管道中的新的端点路由功能,以及它如何演进到当前在预览版3的即将发布的版本3.0. 端点路由背后的动机 在端点路由之前,在HTTP请求处理管道的末尾,在ASP.NET Core MVC中间件中完成了ASP.NET Core应用程序的路由解析.这意味着在中间件管道中的MVC中间件之前,路由信息(例如将执行哪些控制器操作)对于处理请求的中间件不可用. 例如在CORS或授权中间件中提供

探索Asp net core3中的 项目文件、Program.cs和通用host(译)

引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版中是怎样改变的,以及探讨Aspnetcore3.0使用的Api的变化. *** 介绍 .Net core 3.0 会在九月23号的 NET Conf上发布,但现在已经有一个支持的预览版本(Preview 8).最新的预览版本与最终发布版本不可能有太多的变化,所以现在是开始尝试和查看3.0增加的功能的

ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware.CustomizeMiddleware和Asp.NetCore Identity.但是由于所有的ASP.NET Core的版本有些老,所以,此次重写一次.使用最新的ASP.NET Core 1.1版本.对于ASP.NET Core 1.1 Preview 1会在以后的文章中介绍 目录 使用静态文件 使用路由

asp.net core 系列 15 中间件

原文:asp.net core 系列 15 中间件 一.概述 中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件. 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作. 请求委托用于生成请求管道. 请求委托会处理每个 HTTP 请求.使用以下方法配置请求委托:Run,  Map, Use扩展方法.可以将单个请求委托作为匿名方法(称为内联中间件in-line middleware) 或者可以在可重用类中定义.这些可重用的类和内联

ASP.NET Core 中的中间件

ASP.NET Core 中的中间件(Middleware) 在这个节中,我们将了解,ASP.NET Core 中的中间件是 什么?中间件很重要,尤其是在你想当架构师这一条路上. ASP.NET Core 中的中间件是 什么? 在 ASP.NET Core 中,中间件(Middleware)是一个可以处理 HTTP 请求或响应的软件管道. ASP.NET Core 中给中间件组件的定位是具有非常特定的用途.例如,我们可能有需要一个中间件组件验证用户,另一个中间件来处理错误,另一个中间件来提供静态

Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)

一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件.换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址.有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面.如果想对自己的网站进行防盗链保护,则需要针对不同的情况进行区

asp.net core 自定义异常处理中间件

原文:asp.net core 自定义异常处理中间件 asp.net core 自定义异常处理中间件 Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异常,不希望记录错误日志,目前主要是用户请求取消导致的 TaskCanceledException 和 OperationCanceledException 异常.因为我的 ERROR 级别的日志会输出到 Sentry,sentry的异常会自动发邮

ASP.NET Core3.0+EntityFrameWork Core3.0更新后的一个关于GroupBy的坑

ASP.NET Core3.0终于正式更新了,调整好发布版之后,着急忙慌的开始更新新版本. 真的很艰难啊,Setup文件修改就很痛苦,一会api Router不好使了,一会Contorller也404了......(这些坑其实也应该写出来的,还是没有写博客的好习惯啊) 今天遇上的是分组问题 GroupBy . 我有一个工作量统计图表功能,正常情况下,选择两个员工,表格是下图: 更新后,变成了下图: 额,发生了什么???? 一开始还以为是GroupBy 的工作机制变了,后来在文章 https://

Linux之nohup命令:实现退出终端后程序继续后台运行

转自:http://tech.ccidnet.com/art/302/20070618/1115599_1.html 简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦:另一种方法是仍然用普通方法编程,然后用nohup命令启动程序: nohup<程序名>& 则控制台logout后,进程仍然继续运行,起到守护进程的作