中间件 vs 过滤器

莱莱  金牌会员 | 2025-1-12 11:57:36 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

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

定义

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


  • 全局性:中间件作用于整个应用程序的请求管道,适用于所有请求。
  • 序次性:中间件的执行序次由 UseMiddleware 或 Use 方法的调用序次决定。
  • 灵活性:可以处理请求和响应,甚至可以停止请求管道(不调用下一个中间件)。
  • 低级别:中间件更接近底层,可以直接操纵 HttpContext。
适用场景


  • 全局的请求处理逻辑(如身份验证、日记记载、非常处理)。
  • 修改请求或响应的内容(如添加自定义头、压缩响应)。
  • 停止请求管道(如未授权的请求直接返回 401)。
示例
  1. public class CustomMiddleware
  2. {
  3.     private readonly RequestDelegate _next;
  4.     public CustomMiddleware(RequestDelegate next)
  5.     {
  6.         _next = next;
  7.     }
  8.     public async Task InvokeAsync(HttpContext context)
  9.     {
  10.         // 处理请求
  11.         context.Response.Headers.Add("X-Custom-Header", "Middleware");
  12.         // 调用下一个中间件
  13.         await _next(context);
  14.     }
  15. }
  16. // 注册中间件
  17. 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:在操纵结果执行前后执行逻辑(如格式化响应)。
示例
  1. public class CustomActionFilter : IActionFilter
  2. {
  3.     public void OnActionExecuting(ActionExecutingContext context)
  4.     {
  5.         // 在操作执行前执行
  6.         context.HttpContext.Response.Headers.Add("X-Custom-Header", "ActionFilter");
  7.     }
  8.     public void OnActionExecuted(ActionExecutedContext context)
  9.     {
  10.         // 在操作执行后执行
  11.     }
  12. }
  13. // 注册过滤器
  14. [ServiceFilter(typeof(CustomActionFilter))]
  15. public class HomeController : Controller
  16. {
  17.     public IActionResult Index()
  18.     {
  19.         return View();
  20.     }
  21. }
复制代码
中间件 vs 过滤器的对比

特性中间件(Middleware)过滤器(Filters)作用范围全局(整个应用程序的请求管道)局部(特定的控制器或操纵)执行序次在请求管道的早期执行在 MVC 操纵执行前后执行适用场景全局的请求处理逻辑(如日记、非常处理)控制器或操纵级别的逻辑(如授权、模子验证)访问上下文直接访问 HttpContext访问 MVC 特定的上下文(如 ActionContext)灵活性更灵活,可以停止请求管道更专注于 MVC 操纵的举动性能更轻量,得当底层操纵稍重,得当 MVC 特定的逻辑怎样选择?


  • 利用中间件

    • 当你需要处理全局的请求逻辑时。
    • 当你需要直接操纵 HttpContext 时。
    • 当你需要在 MVC 框架之外处理请求时。

  • 利用过滤器

    • 当你需要处理特定控制器或操纵的逻辑时。
    • 当你需要与 MVC 框架紧密集成时(如授权、模子验证)。
    • 当你需要在操纵执行前后执行特定逻辑时。

联合利用

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

  • 利用中间件处理全局的日记记载和非常处理。
  • 利用过滤器处理控制器或操纵级别的授权和模子验证。
通过合理利用中间件和过滤器,可以构建一个高效、灵活且易于维护的 ASP.NET Core 应用程序。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表