ASP.NET Core中间件用法与官方常用中间件介绍

2022-04-17 18:17:33
目录
一、什么是中间件中间件和过滤器的区别二、中间件常用方法1、Run方法2、Use方法3、Map方法4、Mapwhen方法三、自定义中间件四、官方常用中间件1、异常处理中间件2、HTTPS重定向中间件3、静态文件中间件4、Cookie中间件5、路由中间件6、身份认证中间件7、授权中间件8、会话中间件9、终结点路由中间件

一、什么是中间件

我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终才会到达我们写的代码中。而中间件就是用于组成应用程序管道来处理请求和响应的组件。管道内的每一个组件都可以选择是否将请求转交给下一个组件,并在管道中调用下一个组件之前和之后执行某些操作。请求委托被用来建立请求管道,请求委托处理每一个HTTP请求。

中间件可以认为有两个基本的职责:

选择是否将请求传递给管道中的下一个中间件。可以在管道中的下一个中间件前后执行一些工作。

请求委托通过使用IApplicationBuilder类型的Run、Map以及Use扩展方法来配置,并在Startup类中传给Configure方法。每个单独的请求委托都可以被指定为一个内嵌匿名方法,或其定义在一个可重用的类中。这些可以重用的类被称作“中间件”或“中间件组件”。每个位于请求管道内的中间件组件负责调用管道中下一个组件,或适时短路调用链。中间件是一个典型的AOP应用。

ASP.NET Core请求管道由一系列的请求委托所构成,它们一个接着一个的被调用,看下面一张微软官方的中间件请求管道图(图中执行线程按黑色箭头的顺序执行):

context.Response.WriteAsync("There is non-Map delegate rn");});

运行程序,输出结果:

ASP.NETCore中间件用法与官方常用中间件介绍

在url里面添加name查询参数输出结果:

ASP.NETCore中间件用法与官方常用中间件介绍

在url里面添加age查询参数输出结果:

ASP.NETCore中间件用法与官方常用中间件介绍

三、自定义中间件

在上面的例子中,我们都是使用的官方中间件自动的方法,其实我们也可以自己编写一个中间件。

中间件遵循显示依赖原则,并在其构造函数中暴露所有依赖项。中间件能够利用UseMiddleware<T>扩展方法的优势,直接通过它们的构造函数注入服务。依赖注入服务是自动完成填充的。

ASP.NET Core约定中间件类必须包括以下内容:

具有类型为RequestDelegate参数的公共构造函数。必须有名为Invoke或InvokeAsync的公共方法,此方法必须满足两个条件:方法返回类型是Task、方法的第一个参数必须是HttpContext类型。

我们自定义一个记录IP的中间件,新建一个类RequestIPMiddleware,代码如下:

using Microsoft.AspNetCore.Http;using System.Threading.Tasks;namespace MiddlewareDemo.Middleware{    /// <summary>    /// 记录IP地址的中间件    /// </summary>    public class RequestIPMiddleware    {        // 私有字段        private readonly RequestDelegate _next;        /// <summary>        /// 公共构造函数,参数是RequestDelegate类型        /// 通过构造函数进行注入,依赖注入服务会自动完成注入        /// </summary>        /// <param name="next"></param>        public RequestIPMiddleware(RequestDelegate next)        {            _next = next;        }        /// <summary>        /// Invoke方法        /// 返回值是Task,参数类型是HttpContext        /// </summary>        /// <param name="context">Http上下文</param>        /// <returns></returns>        public async Task Invoke(HttpContext context)        {            await context.Response.WriteAsync($"User IP:{context.Connection.RemoteIpAddress.ToString()}rn");            // 调用管道中的下一个委托            await _next.Invoke(context);        }    }}

然后创建一个扩展方法,对IApplicationBuilder进行扩展:

using Microsoft.AspNetCore.Builder;namespace MiddlewareDemo.Middleware{    public static class RequestIPExtensions    {        /// <summary>        /// 扩展方法,对IApplicationBuilder进行扩展        /// </summary>        /// <param name="builder"></param>        /// <returns></returns>        public static IApplicationBuilder UseRequestIP(this IApplicationBuilder builder)        {            // UseMiddleware<T>            return builder.UseMiddleware<RequestIPMiddleware>();        }    }}

最后在Startup类的Configure方法中使用自定义中间件:

// 使用自定义中间件app.UseRequestIP();

运行程序,查看结果:

ASP.NETCore中间件用法与官方常用中间件介绍

这样就完成了一个自定义中间件。

四、官方常用中间件

1、异常处理中间件

当应用程序在开发环境中运行时,开发人员异常页中间件( UseDeveloperExceptionPage )报告应用程序运行时的错误。

当应用程序在生产环境中运行时,异常处理中间件( UseExceptionHandler )捕获下面中间件中引发的异常。

2、HTTPS重定向中间件

HTTPS重定向中间件( UseHttpsRedirection )会将HTTP请求重定向到HTTPS。

3、静态文件中间件

静态文件中间件( UseStaticFiles )返回静态文件,并简化进一步请求处理。

4、Cookie中间件

Cookie策略中间件( UseCookiePolicy )使应用符合欧盟一般数据保护条例的规定。

5、路由中间件

路由中间件( UseRouting )用于路由的请求。

6、身份认证中间件

身份认证中间件( UseAuthentication )尝试对用户进行身份验证,验证通过之后才会允许用户访问安全资源。

7、授权中间件

授权中间件( UseAuthorization )用于授权验证通过的用户可以访问哪些资源。

8、会话中间件

会话中间件( UseSession )建立和维护会话状态。如果应用程序使用会话状态,请在Cookie策略中间件之后和MVC中间件之前调用会话中间件。

9、终结点路由中间件

终结点路由中间件( UseEndpoints )用于将 Razor Pages 终结点添加到请求管道。

更多中间件组件可以到aspnet 的github仓库中查看:https://github.com/aspnet。

示例代码GitHub地址:https://github.com/jxl1024/Middleware

到此这篇关于ASP.NET Core中间件用法与官方常用中间件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。