什么是中间件?

这里引用官方解释:

中间件是用于组成应用程序管道来处理请求和响应的组件。管道内的每一个组件都可以选择是否将请求交给下一个组件、并在管道中调用下一个组件之前和之后执行某些操作。请求委托被用来建立请求管道,请求委托处理每一个 HTTP 请求。

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

ASP.NET 请求管道由一系列的请求委托所构成,它们一个接着一个被调用,如图所示(该执行线程按黑色箭头的顺序执行):

ASP.Net Core内置很多中间件,如:静态文件,身份验证,MVC等。

这里需要注意的是,中间件添加的顺序非常重要,这会影响他们处理请求的顺序。如果顺序添加不对,很可能其中某个中间件会造成管道短路,不能触发下一个请求委托,造成系统异常。

自定义中间件

1.自定义中间件处理逻辑。

     public class MyMiddleWare
{
private readonly ILogger logger;
private readonly RequestDelegate next;
/// <summary>
/// 通过构造函数 注入Logger日志和Http请求委托
/// </summary>
/// <param name="_logger"></param>
/// <param name="_next"></param>
public MyMiddleWare(ILogger<MyMiddleWare> _logger, RequestDelegate _next)
{
logger = _logger;
next = _next;
} /// <summary>
/// 在调用下一个组件之前和之后执行某些操作
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
logger.LogInformation("自定义中间件,开始" + DateTime.Now);
await next.Invoke(context);
logger.LogInformation("自定义中间件,结束" + DateTime.Now);
}
}

2.使用IApplicationBuilder向应用程序的请求管道添加中间件

     public static class ServiceExtensions
{
public static IApplicationBuilder UserMyMiddleWare(this IApplicationBuilder app)
{
return app.UseMiddleware<MyMiddleWare>();
}
}

3.通过Configure方法添加自定义中间件。

Configure 方法用于指定 ASP.NET 应用程序将如何响应每一个 HTTP 请求。中间件需要最终在这里添加。

         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//wwroot目录下静态文件
app.UseStaticFiles();
//添加自定义中间件
app.UserMyMiddleWare();
}

当然大家也可以在Configure 方法中直接使用 app.UseMiddleware<MyMiddleWare>()进行添加,我这里是单独做了一个派生类,方便管理吧。

好了,然后我们启动程序,大家会发现我们刚才添加的中间件处理请求信息:

最新文章

  1. JVM参数调优
  2. 用Ossim管理IT资产(视频)
  3. MyEclipse — Maven+Spring+Struts+Hibernate 整合 [学习笔记-2]
  4. Painter 12安装教程
  5. 【跟我一起学Python吧】Python 多线程
  6. linux fork函数与vfork函数
  7. 设计Mysql索引的原则
  8. JDK,Tomcat,myeclipse相关资料
  9. SAN &amp; vSAN &amp; vSAN storage
  10. Java集合详解二
  11. IdentityServer4 密码模式认证
  12. linux取IP的几个方法
  13. 005_tcp/ip监控
  14. Learning-Python【28】:基于TCP协议通信的套接字
  15. CentOs系统设置python版本
  16. 用IntelliJ IDEA编译,编译之后提示 无效的标记: -release
  17. 关于如何利用计算属性进行button的控制
  18. 学习Struts2的个人疑惑及问题解决
  19. nginx支持HTTP2的配置过程
  20. iOS基础知识之归档和解档

热门文章

  1. 【新手引导】MAC如何允许安装任何来源的软件(安装第三方软件/应用)
  2. Kubernetes实践踩坑系列(一).应用管理的难题
  3. 远程快速安装mysql
  4. Html响应式图片
  5. UIAutomator2的API文档(一)
  6. 问答题:你下班后是选择关电脑?Or,只关闭显示器?
  7. Java集合(九)哈希冲突及解决哈希冲突的4种方式
  8. Rocket - debug - Example: Selecting Harts
  9. Chisel3 - util - Lookup
  10. Java获取当前时间到凌晨12点剩余秒数