中间件官网文档解释:中间件是一种装配到应用管道以处理请求和响应的软件 每个中间件:

  • 选择是否将请求传递到管道中的下一个组件。
  • 可在管道中的下一个组件前后执行工作。

使用 IApplicationBuilder 创建中间件管道

ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。

IApplicationBuilder提供了三个扩展方法配置请求委托

  • app.Run 作用添加一个终端中间件,因为不在向下传递请求,常常公开在管道末尾运行。实例代码
复制代码
  app.Run(async context =>         {             await context.Response.WriteAsync("Hello, middleware!");         });
复制代码
  • app.Use 将多个请求委托链接在一起。next 参数表示管道中的下一个委托。 可通过不 调用 next 参数使管道短路等同于aap.run。 通常可在下一个委托前后执行操作,如以下示例所示:
复制代码
  app.Use(async (context, next) =>         {             // 传递前操作            await next.Invoke();             // 传递前操作        });          app.Run(async context =>         {             await context.Response.WriteAsync("Hello from 2nd delegate.");         });     }
复制代码
  • Map 扩展用作约定来创建管道分支。 Map 基于给定请求路径的匹配项来创建请求管道分支。 如果请求路径以给定路径开头,则执行分支。实例代码如下
复制代码
  private static void HandleMapTest1(IApplicationBuilder app)     {         app.Run(async context =>         {             await context.Response.WriteAsync("Map Test 1");         });     }      private static void HandleMapTest2(IApplicationBuilder app)     {         app.Run(async context =>         {             await context.Response.WriteAsync("Map Test 2");         });     }      public void Configure(IApplicationBuilder app)     {         app.Map("/map1", HandleMapTest1);          app.Map("/map2", HandleMapTest2);          app.Run(async context =>         {             await context.Response.WriteAsync("Hello from non-Map delegate. <p>");         });     }
复制代码

自定义中间件

以下演示记录api输入输出参数的中间件。