中间件 vs 过滤器
在 ASP.NET Core 中,中间件(Middleware) 和 过滤器(Filters) 是两种不同的机制,用于处理请求和响应的管道。它们的作用和适用场景有所不同,以下是它们的对比和详细说明:
中间件(Middleware)
定义
中间件是 ASP.NET Core 请求处理管道中的组件,用于处理 HTTP 请求和响应。每个中间件可以对请求进行处理,并决定是否将请求传递给下一个中间件。
特点
- 全局性:中间件作用于整个应用程序的请求管道,适用于所有请求。
- 顺序性:中间件的执行顺序由
UseMiddleware或Use方法的调用顺序决定。 - 灵活性:可以处理请求和响应,甚至可以终止请求管道(不调用下一个中间件)。
- 低级别:中间件更接近底层,可以直接操作
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 框架的一部分,而不是请求管道的一部分。
特点
- 局部性:过滤器可以应用于特定的控制器或操作,而不是全局的。
- 细粒度控制:可以在操作执行前、执行后或执行过程中插入逻辑。
- MVC 集成:过滤器与 MVC 框架紧密集成,可以访问 MVC 特定的上下文(如
ActionExecutingContext)。 - 高级别:过滤器更关注 MVC 操作的行为,而不是底层的 HTTP 请求。
适用场景
- 控制器或操作级别的逻辑(如授权、模型验证、日志记录)。
- 修改操作的结果(如格式化响应、处理异常)。
- 在操作执行前后执行特定逻辑。
过滤器类型
- Authorization Filters:用于授权(如
[Authorize])。 - Resource Filters:在操作执行前后执行逻辑(如缓存)。
- Action Filters:在操作执行前后执行逻辑(如日志记录)。
- Exception Filters:处理操作中的异常。
- 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 特定的逻辑 |
如何选择?
- 使用中间件:
- 当你需要处理全局的请求逻辑时。
- 当你需要直接操作
HttpContext时。 - 当你需要在 MVC 框架之外处理请求时。
- 使用过滤器:
- 当你需要处理特定控制器或操作的逻辑时。
- 当你需要与 MVC 框架紧密集成时(如授权、模型验证)。
- 当你需要在操作执行前后执行特定逻辑时。
结合使用
在实际项目中,中间件和过滤器可以结合使用。例如:
- 使用中间件处理全局的日志记录和异常处理。
- 使用过滤器处理控制器或操作级别的授权和模型验证。
通过合理使用中间件和过滤器,可以构建一个高效、灵活且易于维护的 ASP.NET Core 应用程序。
中间件 vs 过滤器的更多相关文章
- Asp.Net Core MVC框架内置过滤器
第一部分.MVC框架内置过滤器 下图展示了Asp.Net Core MVC框架默认实现的过滤器的执行顺序: Authorization Filters:身份验证过滤器,处在整个过滤器通道的最顶层.对应 ...
- Filters in ASP.NET Core(Net6之过滤器)
Filters in ASP.NET Core 如果觉得样式不好:跳转即可 (md文件复制过来有些样式会不一样) 原文地址:https://lifengying.site/archives/net6% ...
- 第13章 MVC和Razor Pages过滤器管道(ASP.NET Core in Action, 2nd Edition)
本章包括 过滤器管道及其与中间件的区别 创建自定义筛选器以重构复杂的操作方法 使用授权筛选器保护您的操作方法和Razor页面 短路筛选器管道以绕过操作和页面处理程序执行 将依赖项注入筛选器 在第1部分 ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- 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 ...
- ASP.NET Core 中文文档 第三章 原理(5)错误处理
原文:Error Handling 作者:Steve Smith 翻译:谢炀(Kiler) 校对:高嵩(jack2gs).何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(五)-- Filter
在上一篇里,介绍了中间件的相关内容和使用方法.本篇将介绍Asp.Net Core MVC框架的过滤器的相关内容和使用方法,并简单说明一下与中间件的区别. 第一部分.MVC框架内置过滤器 下图展示了As ...
- 如何测量并报告ASP.NET Core Web API请求的响应时间
介绍 大家都知道性能是API的流行语.而相应时间则是API性能的一个重要并且可测量的参数.在本文中,我们将了解如何使用代码来测量API的响应时间,然后将响应时间数据返回到客户端. 作者:依乐祝 原文地 ...
- vue-router新手指南
在学习完vue.js以及vuex之后,我们还剩下vue全家桶中的最后一个需要学习的组件,这就是vue-router了,本篇文章我们就来一起认识和入门vue-router.为什么我们只是入门呢?因为在这 ...
- Python学习---Django拾遗180328
Django之生命周期 前台发送URL请求到Django的中间件进行内容校验,完成校验后到达路由映射文件url.py,然后调用视图函数views.py里面的函数进行内容处理[ 1.操作数据库进行数据读 ...
随机推荐
- java中如何将Object类型转换为int类型
如何将Object类型转换为int类型 Object object = null; try { Integer.parseInt(object.toString()); } catch (Number ...
- JS转义html编码
两个方法: 1.利用用浏览器内部转换器实现html转义: 2.用正则表达式实现html转义: var HtmlUtil = { /*1.用浏览器内部转换器实现html编码(转义)*/ htmlEnco ...
- 面试真题:OOM(OutOfMemoryError)SOF(StackOverflow)你遇到过哪些情况
前言 本来想着给自己放松一下,刷刷博客,慕然回首,OOM?SOF?似乎有点模糊了,那就大概看一下Java面试题吧.好记性不如烂键盘 *** 12万字的java面试题整理 *** OOM你遇到过哪些情况 ...
- php技术交流群
php技术交流群-656679284,为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步!也欢迎大牛入群指导!
- 开源 PHP 商城项目 CRMEB 二次开发和部署教程
上篇文章给大家介绍了如何使用 Sealos 应用商店一键部署 CRMEB 开源商城系统,那速度真叫一个快啊,比宝塔快多了! 但是有些读者还不满足于此,问我能不能边运行边改代码,而且还得用 Cursor ...
- curl访问etcd报错unable to set private key file
[appdeploy@1a32vla0168zzzz cfssl]$ curl -i https://xxx.xxx.xxx.5:2379/health --cacert /app/etcd/cfss ...
- JVM 核心技术
1.Java代码编译和执行的整个过程: 2. JVM内存管理及垃圾回收机制: 先看图, 二.Java代码编译和执行的整个过程 Java代码编译是由Java源码编译器来完成,流程图如下所示: Java ...
- 接口文档解决方案之Torna
◆一.开源项目简介 接口文档解决方案,目标是让接口文档管理变得更加方便.快捷.Torna采用团队协作的方式管理和维护接口文档,将不同形式的文档纳入进来统一维护. Torna弥补了传统文档生成工具(如s ...
- Linux之定时任务crontab
一.cron.d增加定时任务 当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab.但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的. 例如,增加一 ...
- Linux查看进程所在目录
通过ps 或 top 查看进程信息时,只能查到进程的相对路径,查不到进程的详细信息,如绝对路径等,我们可以通过下面的方法进行查询 1. 通过ll /proc/PID 命令查看进程所在的目录位置 lin ...