在 ASP.NET Core 中,中间件(Middleware)过滤器(Filters) 是两种不同的机制,用于处理请求和响应的管道。它们的作用和适用场景有所不同,以下是它们的对比和详细说明:


中间件(Middleware)

定义

中间件是 ASP.NET Core 请求处理管道中的组件,用于处理 HTTP 请求和响应。每个中间件可以对请求进行处理,并决定是否将请求传递给下一个中间件。

特点

  1. 全局性:中间件作用于整个应用程序的请求管道,适用于所有请求。
  2. 顺序性:中间件的执行顺序由 UseMiddlewareUse 方法的调用顺序决定。
  3. 灵活性:可以处理请求和响应,甚至可以终止请求管道(不调用下一个中间件)。
  4. 低级别:中间件更接近底层,可以直接操作 HttpContext

适用场景

  • 全局的请求处理逻辑(如身份验证、日志记录、异常处理)。
  • 修改请求或响应的内容(如添加自定义头、压缩响应)。
  • 终止请求管道(如未授权的请求直接返回 401)。

示例

public class CustomMiddleware
{
    private readonly RequestDelegate _next;     public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }     public async Task InvokeAsync(HttpContext context)
    {
        // 处理请求
        context.Response.Headers.Add("X-Custom-Header", "Middleware");         // 调用下一个中间件
        await _next(context);
    }
} // 注册中间件
app.UseMiddleware<CustomMiddleware>();

过滤器(Filters)

定义

过滤器是 ASP.NET Core MVC 或 Minimal API 中的一种机制,用于在特定的 MVC 操作(Action)或控制器(Controller)前后执行逻辑。过滤器是 MVC 框架的一部分,而不是请求管道的一部分。

特点

  1. 局部性:过滤器可以应用于特定的控制器或操作,而不是全局的。
  2. 细粒度控制:可以在操作执行前、执行后或执行过程中插入逻辑。
  3. MVC 集成:过滤器与 MVC 框架紧密集成,可以访问 MVC 特定的上下文(如 ActionExecutingContext)。
  4. 高级别:过滤器更关注 MVC 操作的行为,而不是底层的 HTTP 请求。

适用场景

  • 控制器或操作级别的逻辑(如授权、模型验证、日志记录)。
  • 修改操作的结果(如格式化响应、处理异常)。
  • 在操作执行前后执行特定逻辑。

过滤器类型

  1. Authorization Filters:用于授权(如 [Authorize])。
  2. Resource Filters:在操作执行前后执行逻辑(如缓存)。
  3. Action Filters:在操作执行前后执行逻辑(如日志记录)。
  4. Exception Filters:处理操作中的异常。
  5. Result Filters:在操作结果执行前后执行逻辑(如格式化响应)。

示例

public class CustomActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 在操作执行前执行
        context.HttpContext.Response.Headers.Add("X-Custom-Header", "ActionFilter");
    }     public void OnActionExecuted(ActionExecutedContext context)
    {
        // 在操作执行后执行
    }
} // 注册过滤器
[ServiceFilter(typeof(CustomActionFilter))]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

中间件 vs 过滤器的对比

特性 中间件(Middleware) 过滤器(Filters)
作用范围 全局(整个应用程序的请求管道) 局部(特定的控制器或操作)
执行顺序 在请求管道的早期执行 在 MVC 操作执行前后执行
适用场景 全局的请求处理逻辑(如日志、异常处理) 控制器或操作级别的逻辑(如授权、模型验证)
访问上下文 直接访问 HttpContext 访问 MVC 特定的上下文(如 ActionContext
灵活性 更灵活,可以终止请求管道 更专注于 MVC 操作的行为
性能 更轻量,适合底层操作 稍重,适合 MVC 特定的逻辑

如何选择?

  1. 使用中间件

    • 当你需要处理全局的请求逻辑时。
    • 当你需要直接操作 HttpContext 时。
    • 当你需要在 MVC 框架之外处理请求时。
  2. 使用过滤器
    • 当你需要处理特定控制器或操作的逻辑时。
    • 当你需要与 MVC 框架紧密集成时(如授权、模型验证)。
    • 当你需要在操作执行前后执行特定逻辑时。

结合使用

在实际项目中,中间件和过滤器可以结合使用。例如:

  • 使用中间件处理全局的日志记录和异常处理。
  • 使用过滤器处理控制器或操作级别的授权和模型验证。

通过合理使用中间件和过滤器,可以构建一个高效、灵活且易于维护的 ASP.NET Core 应用程序。

中间件 vs 过滤器的更多相关文章

  1. Asp.Net Core MVC框架内置过滤器

    第一部分.MVC框架内置过滤器 下图展示了Asp.Net Core MVC框架默认实现的过滤器的执行顺序: Authorization Filters:身份验证过滤器,处在整个过滤器通道的最顶层.对应 ...

  2. Filters in ASP.NET Core(Net6之过滤器)

    Filters in ASP.NET Core 如果觉得样式不好:跳转即可 (md文件复制过来有些样式会不一样) 原文地址:https://lifengying.site/archives/net6% ...

  3. 第13章 MVC和Razor Pages过滤器管道(ASP.NET Core in Action, 2nd Edition)

    本章包括 过滤器管道及其与中间件的区别 创建自定义筛选器以重构复杂的操作方法 使用授权筛选器保护您的操作方法和Razor页面 短路筛选器管道以绕过操作和页面处理程序执行 将依赖项注入筛选器 在第1部分 ...

  4. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  5. ASP.NET Core 1.1 Preview 1 简介(包含.NETCore 1.1升级公告)

    ASP.NET Core 1.1 Preview 1于2016年10月25日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强. 要将现有项目更新到ASP.NET Core 1.1 Pre ...

  6. ASP.NET Core 中文文档 第三章 原理(5)错误处理

    原文:Error Handling 作者:Steve Smith 翻译:谢炀(Kiler) 校对:高嵩(jack2gs).何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法 ...

  7. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(五)-- Filter

    在上一篇里,介绍了中间件的相关内容和使用方法.本篇将介绍Asp.Net Core MVC框架的过滤器的相关内容和使用方法,并简单说明一下与中间件的区别. 第一部分.MVC框架内置过滤器 下图展示了As ...

  8. 如何测量并报告ASP.NET Core Web API请求的响应时间

    介绍 大家都知道性能是API的流行语.而相应时间则是API性能的一个重要并且可测量的参数.在本文中,我们将了解如何使用代码来测量API的响应时间,然后将响应时间数据返回到客户端. 作者:依乐祝 原文地 ...

  9. vue-router新手指南

    在学习完vue.js以及vuex之后,我们还剩下vue全家桶中的最后一个需要学习的组件,这就是vue-router了,本篇文章我们就来一起认识和入门vue-router.为什么我们只是入门呢?因为在这 ...

  10. Python学习---Django拾遗180328

    Django之生命周期 前台发送URL请求到Django的中间件进行内容校验,完成校验后到达路由映射文件url.py,然后调用视图函数views.py里面的函数进行内容处理[ 1.操作数据库进行数据读 ...

随机推荐

  1. NPM 包开发与优化全面指南

    前言 Hey, 我是 Immerse 系列文章首发于[Immerse],更多内容请关注该网站 转载说明:转载请注明原文出处及版权声明! 1. 理解 NPM 包的结构 1.1 package.json ...

  2. 快速激活JRebel的方法

    当谈到 JRebel 的激活时,有几种方法可以让您在 IntelliJ IDEA 中使用它.以下是一些选项: 在线激活(推荐): 安装 JRebel 插件后,点击 Jrebel Activation  ...

  3. Docker容器制作DockerFile

    Docker换国内源和简单操作 vim /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror ...

  4. 基于surging的木舟平台如何构建起微服务

    一.概述 木舟平台分为微服务平台和物联网平台, 上面几篇都是介绍如何通过网络组件接入设备,那么此篇文章就细致介绍下在木舟平台下如何构建微服务. 木舟 (Kayak) 是什么? 木舟(Kayak)是基于 ...

  5. 『玩转Streamlit』--交互类组件

    交互类组件在Web应用程序中至关重要,它们允许用户与应用进行实时互动,能够显著提升用户体验. 用户不再只是被动地接收信息,而是可以主动地输入数据.做出选择或触发事件,从而更加深入地参与到应用中来. 此 ...

  6. app&小程序&web安全—sign签名绕过

    零.前言 在web界面登陆时,小程序和app传输数据时经常会碰到签名,会对请求的参数进行签名,如果自己修改了数据包就会校验失败非常麻烦. 本文编写的契机就是因为碰到了一个JeecgBoot的小程序, ...

  7. 【Azure 环境】从网络包中分析出TLS加密套件信息

    问题描述 在抓取到网络包之后,如何来获取TLS信息呢?比如使用的是是么加密套件呢? 因为在应用层面,获取的错误信息非常简单: An TLS 1.2 connection request was rec ...

  8. 鸿蒙NEXT开发案例:二维码的生成与识别

    [引言] 在本篇文章中,我们将探讨如何在鸿蒙NEXT平台上实现二维码的生成与识别功能.通过使用ArkUI组件库和相关的媒体库,我们将创建一个简单的应用程序,用户可以生成二维码并扫描识别. [环境准备] ...

  9. 在matlab中使用遗传算法执行最优化

    遗传算法是一种通用的最优化方法,具体原理可以看:遗传算法详解与实验.下面记录在Matlab中如何使用遗传算法来做优化. 用法 调用方式如下: 1 x = ga(fun,nvars) 2 x = ga( ...

  10. Sublime之快捷操作

    列举常用的Sublime操作,涉及操作 1.每行默认需要统一添加逗号 1)全选 ctrl + a 2) 组合键 ctrl + shift + l 即可进行操作 (这里是L哦) 之后也可以使用HOME键 ...