什么是中间件?
这里引用官方解释:
中间件是用于组成应用程序管道来处理请求和响应的组件。管道内的每一个组件都可以选择是否将请求交给下一个组件、并在管道中调用下一个组件之前和之后执行某些操作。请求委托被用来建立请求管道,请求委托处理每一个 HTTP 请求。
请求委托通过使用 IApplicationBuilder 类型的 Run、Map 以及 Use 扩展方法来配置,并在 Startup
类中传给 Configure
方法 。每个单独的请求委托都可以被指定为一个内嵌匿名方法,或其定义在一个可重用的类中。这些可重用的类被称作 中间件 或 中间件组件。每个位于请求管道内的中间件组件负责调用管道中下一个组件,或适时短路调用链。
ASP.NET 请求管道由一系列的请求委托所构成,它们一个接着一个被调用,如图所示(该执行线程按黑色箭头的顺序执行):
ASP.Net Core内置很多中间件,如:静态文件,身份验证,MVC等。
这里需要注意的是,中间件添加的顺序非常重要,这会影响他们处理请求的顺序。如果顺序添加不对,很可能其中某个中间件会造成管道短路,不能触发下一个请求委托,造成系统异常。
自定义中间件
1.自定义中间件处理逻辑。
1 public class MyMiddleWare 2 { 3 private readonly ILogger logger; 4 private readonly RequestDelegate next; 5 /// <summary> 6 /// 通过构造函数 注入Logger日志和Http请求委托 7 /// </summary> 8 /// <param name="_logger"></param> 9 /// <param name="_next"></param> 10 public MyMiddleWare(ILogger<MyMiddleWare> _logger, RequestDelegate _next) 11 { 12 logger = _logger; 13 next = _next; 14 } 15 16 /// <summary> 17 /// 在调用下一个组件之前和之后执行某些操作 18 /// </summary> 19 /// <param name="context"></param> 20 /// <returns></returns> 21 public async Task Invoke(HttpContext context) 22 { 23 logger.LogInformation("自定义中间件,开始" + DateTime.Now); 24 await next.Invoke(context); 25 logger.LogInformation("自定义中间件,结束" + DateTime.Now); 26 } 27 }
2.使用IApplicationBuilder向应用程序的请求管道添加中间件
1 public static class ServiceExtensions 2 { 3 public static IApplicationBuilder UserMyMiddleWare(this IApplicationBuilder app) 4 { 5 return app.UseMiddleware<MyMiddleWare>(); 6 } 7 }
3.通过Configure方法添加自定义中间件。
Configure
方法用于指定 ASP.NET 应用程序将如何响应每一个 HTTP 请求。中间件需要最终在这里添加。
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 2 { 3 if (env.IsDevelopment()) 4 { 5 app.UseDeveloperExceptionPage(); 6 } 7 //wwroot目录下静态文件 8 app.UseStaticFiles(); 9 //添加自定义中间件 10 app.UserMyMiddleWare(); 11 }
当然大家也可以在Configure
方法中直接使用 app.UseMiddleware<MyMiddleWare>()进行添加,我这里是单独做了一个派生类,方便管理吧。
好了,然后我们启动程序,大家会发现我们刚才添加的中间件处理请求信息: