中间件(Middleware)
、Middleware 是 ASP.NET Core 的核心组件
、Middleware 用于在 HTTP 请求的处理管道中执行一系列操作,这些操作可以在请求到达最终的处理程序之前或之后执行,从而实现对请求和响应的预处理或后处理
、Middleware 组成一个HTTP 请求的处理管道,整个 ASP.NET Core 的执行过程,就是 HTTP 请求在处理管道中按照 Middleware 注册顺序执行的过程
、每个 HTTP 请求都会经历一系列 Middleware 的处理
、每个 Middleware 都可以决定是否将请求传递给下一个 Middleware 或者自己处理请求并生成响应
、Middleware 的注册顺序,可以按照需求自由组合
、内置中间件:MVC 框架、响应缓存、身份验证、CORS、Swagger 等
、3个部分组成:
– 前逻辑:第一段要执行的逻辑
– next:指向下一个 Middleware
– 后逻辑:从下一个 Middleware 返回后执行的逻辑
通常用于执行以下任务:
、身份验证和授权:验证用户身份并确定其是否有权访问特定资源
、日志记录:记录有关请求和响应的详细信息,以便进行调试和监控
、错误处理:捕获并处理应用程序中的异常,向用户提供友好的错误消息
、请求和响应的修改:在请求到达控制器之前或响应发送回客户端之前,修改请求或响应的内容
注意事项:
、顺序:Middleware 的注册顺序非常重要,因为它决定了它们处理请求的顺序。通常,需要在请求处理管道的早期阶段添加身份验证和错误处理等 Middleware
、异常处理:务必确保 Middleware 能够妥善处理异常,以避免应用程序崩溃。可以使用 try-catch 块来捕获并处理异常
、性能:Middleware 会增加请求处理管道中的开销,在添加 Middleware 时,请需要考虑其对性能的影响,并确保只添加必要的 Middleware
HTTP 请求完整流程(链式执行):
、HTTP 请求
、请求报文解析(框架执行)
、中间件1:执行前逻辑
、中间件1:next 指向下一个中间件
、中间件N:执行前逻辑
、中间件N:next 指向 Action
、中间件N:执行后逻辑,并返回到上一个中间件
、中间件1:执行后逻辑
、响应报文解析(框架执行)
、HTTP 响应
管道(pipeline)
、3个函数:
– Map:用来定义一个管道可以处理哪些请求
– Use:每个 Use 引入一个中间件
– Run:是用来执行最终的核心业务逻辑
、一个管道由若干个 Use 和一个 Run 组成
中间件类
、如果中间件的代码比较复杂,或者需要重复使用一个中间件,可以把代码放到一个单独的中间件类中
、中间件类需要构造函数注入 RequestDelegate 对象,用来指向下一个中间件
、中间件类需要添加 InvokeAsync(或 Invoke) 方法,参数类型 HttpContext,返回值必须是 Task 类型
Middleware 与 Filter 区别
、Middleware 是 ASP.NET Core 提供的功能;Filter 是 ASP.NET Core MVC 提供的功能
、Middleware 可以处理所有的请求;Filter 只能处理对控制器的请求
、Middleware 和 Filter 可以完成很多相似的功能,例如:未处理异常
、优先选择使用中间件,但是如果这个组件只针对 MVC 或者需要调用一些 MVC 相关的类的时候,就只能选择 Filter