Skip to content

中间件和过滤器

中间件和过滤器是两个非常重要的概念,它们都用于处理HTTP请求和响应,但它们的使用场景和工作方式有所不同。

在ASP.NET Core中,中间件和过滤器是两个非常重要的概念,它们都用于处理HTTP请求和响应,但它们的使用场景和工作方式有所不同。

中间件(Middleware)

中间件是ASP.NET Core请求处理管道中的组件,用于构建请求处理流水线。每个中间件组件可以处理请求、修改请求、传递请求到下一个中间件或直接返回响应。中间件是无状态的,并且可以被重复使用。

中间件的主要特点:

  1. 请求处理流水线:中间件按照在Startup.cs中的Configure方法里注册的顺序执行。
  2. 无状态:中间件不存储关于请求的信息。
  3. 可重用:可以创建自定义中间件并在多个应用中使用。
  4. 扩展性:ASP.NET Core提供了许多内置中间件,如身份验证、会话、错误处理等,也可以自定义中间件。

使用中间件的步骤:

  1. 创建中间件类:定义一个类,实现RequestDelegateInvoke方法。
  2. 注册中间件:在Startup.csConfigure方法中使用app.UseMiddleware<YourMiddleware>()注册中间件。

执行顺序

过滤器(Filters)

过滤器是ASP.NET Core MVC或Web API中用于处理请求和响应的一种机制。它们可以用来执行跨请求的功能,如身份验证、日志记录、异常处理等。

过滤器的主要特点:

  1. 多种类型:有五种类型的过滤器:授权过滤器、资源过滤器、动作过滤器、异常过滤器和结果过滤器。
  2. 状态管理:过滤器可以访问请求的上下文,并且可以在请求处理的不同阶段执行。
  3. 依赖于MVC或Web API:过滤器是MVC和Web API框架的一部分,不适用于无MVC或Web API的中间件管道。

使用过滤器的步骤:

  1. 创建过滤器类:定义一个类,实现特定的过滤器接口。
  2. 注册全局过滤器:在Startup.csConfigureServices方法中注册全局过滤器。
  3. 注册特定于操作的过滤器:在控制器或动作方法上使用特性(Attribute)来注册特定于操作的过滤器。

执行顺序

alt text

中间件

ASP.NET Core提供了以下几种类型的筛选器:

  1. 授权筛选器(Authorization Filters)

    • 在授权决策之前执行。
    • 可以用来检查用户是否具有执行操作的权限。
  2. 资源筛选器(Resource Filters)

    • 在整个请求处理管道的开始处执行。
    • 可以用来缩短处理周期,例如,如果某些条件不满足,则直接返回一个结果。
  3. 异常筛选器(Exception Filters)

    • 在动作执行过程中捕获异常。
    • 可以用来记录异常信息或返回一个友好的错误响应。
  4. 动作筛选器(Action Filters)

    • 在动作方法执行之前和之后执行。
    • 可以用来修改传入的参数或处理动作方法的返回值。
  5. 结果筛选器(Result Filters)

    • 在动作结果执行之前和之后执行。
    • 可以用来修改返回给客户端的结果。
  6. 自定义筛选器(Custom Filters)

    • 开发者可以创建自定义筛选器来执行特定的任务。

对比

特性中间件 (Middleware)过滤器 (Filters)
定义处理HTTP请求和响应的组件,是请求管道的基础构建块。控制器和动作方法执行过程中的钩子,用于执行特定任务。
位置Startup.cs中配置请求管道。在控制器或动作方法级别上应用。
执行顺序按照在Startup.cs中注册的顺序执行。按照过滤器类型(授权、资源、异常、动作、结果)的特定顺序执行。
全局/局部可以全局注册影响所有请求,也可以局部注册影响特定请求。通常局部应用到特定的控制器或动作,但也可以在全局注册。
短路能力可以短路请求管道,直接返回响应。某些过滤器(如授权和资源过滤器)可以短路请求管道。
功能范围用于执行全局任务,如身份验证、日志记录、错误处理等。用于执行特定于控制器或动作的任务,如权限检查、日志记录、异常处理等。
依赖注入可以通过构造函数访问服务。也可以通过构造函数访问服务。
代码组织通常用于处理跨多个请求的逻辑。用于封装和重用特定于控制器或动作的逻辑。
执行时机在请求进入控制器之前和响应离开控制器之后执行。在控制器和动作方法的执行前后,以及结果执行前后执行。

更多相关资料可查阅官方文档