ASP.NET Core中间件是一种装配到应用管道以处理请求和响应的软件,中间件是ASP.NET Core 的核心组件。ASP.NET Core 提供了很多丰富的内置中间件组件,但是当内置的中间件不满足需求的情况下,那么你就需要写入自定义中间件。.
初尝试
怎么实现中间件自定义呢,首先我们看看简单的在应用管道里注册中间件和自定义中间件注册。新建一个控制台程序,增加一个Start方法,如下
public static void Start(){//新建一个hosting服务var host = Host.CreateDefaultBuilder()//注册web寄宿服务并默认调用Kestrel服务.ConfigureWebHostDefaults(builder => builder.Configure(app =>app.UseRouting()//注册自带的路由中间件//模拟一个中间件 在默认页面打印Hello world!.Run(context => context.Response.WriteAsync("Hello world!")))).Build();host.Run();}
结果为:

是我们预期的效果。
注意,在控制台应用开启web服务需要修改项目csproj中的sdk,如下
把<Project Sdk="Microsoft.NET.Sdk">修改为:<Project Sdk="Microsoft.NET.Sdk.web">即可
再深入
接下来我们模拟asp.net core中间件注入的使用场景,代码如下:
//这块相当于ASP.NET CORE的program.cs文件public static void Start(){var host = Host.CreateDefaultBuilder()//新建Hosting服务//创建web服务.ConfigureWebHostDefaults(builder => builder//指定要由 Web 主机使用的启动类型。这里启动类是Startup.UseStartup<Startup>()).Build();host.Run();}//启动类是Startup,相当于Startup.cspublic class Startup{ //这里可以进行依赖注入public void ConfigureServices(IServiceCollection services){}//这里可以注册原生管道或者自定义管道public void Configure(IApplicationBuilder app){}}
使用中间件环境配置好了,自定义中间件可以分为两种类型,一是强类型定义,它的好处是实现了Imiddleware接口,使用相对灵活;另一种是基于约定,这种使用的好处是不需要实现任何接口,而且是单例模式。接下来我们先来自定义一个Imiddleware类型的中间件。
//需要继承IMiddleware接口,然后实现InvokeAsync方法public class HelloMiddleware : IMiddleware{public async Task InvokeAsync(HttpContext context, RequestDelegate next){await context.Response.WriteAsync("Hello Middleware");}}//在我们写好的入口程序使用public class Startup{public void ConfigureServices(IServiceCollection services){//单例依赖注入services.AddSingleton<HelloMiddleware>();}public void Configure(IApplicationBuilder app){//用UseMiddleware注册HelloMiddleware中间件app.UseMiddleware<HelloMiddleware>();}}
输出结果:Hello Middleware。
下面我们使用基于约定来实现
//基于约定 先建一个类public class TestMiddleware{//当前中间件需要传递给后续的中间件 我需要调用RequestDelegate _nextprivate readonly RequestDelegate _next;public TestMiddleware(RequestDelegate next){_next = next;}//自己写一个InvokeAsync方法public async Task InvokeAsync(HttpContext httpContext){await httpContext.Response.WriteAsync("Holle TestMiddleware");}}//启动类是Startup,相当于Startup.cspublic class Startup{ //这里可以进行依赖注入 如果中间件里用的其他类,需要在这里依赖注入public void ConfigureServices(IServiceCollection services){}//这里可以注册原生管道或者自定义管道public void Configure(IApplicationBuilder app){//用UseMiddleware注册TestMiddleware中间件app.UseMiddleware<TestMiddleware>();}}
输出结果:Holle TestMiddleware。达到所需要的效果。
结语
本文讲了ASP.NET Core 核心组件中间件的两种自定义方式,约定和强类型,并举例如何使用,大家可以把代码拷贝到本机vs尝试一下ASP.NET Core 的奥秘。此案例适用于.NET Core 3.1、.NET5,在.NET6使用方式略有不同,大家可以试一试。写作水平有限,欢迎大家留言讨论。