当前位置: 首页 > news >正文

.NetCore 过滤器和拦截器 的区别

Asp.NET Core 中的过滤器(Filter)和拦截器(Interceptor)是两个不同的概念,但它们在某些方面有相似之处,也有明显的区别。

🔑过滤器(Filter)

过滤器是Asp.NET Core中用于在  Pipeline 中的特定阶段执行代码的一种机制。它可以用于处理请求和响应,例如:日志记录、身份验证、异常处理 等。

ASP.NET Core提供了多种内置的过滤器类型:

  🔸认证过滤器(Authentication Filter)

  🔸授权过滤器(Authorization Filter)

  🔸响应缓存过滤器(Response Cache Filter)

  🔸异常过滤器(Exception Filter)

  🔸结果过滤器(Result Filter)

🚫拦截器(Interceptor)

拦截器通常是在 AOP(面向切面编程)框架中使用的,如:Castle Windsor, Spring.NET等,它允许你在不修改原始代码的情况下,添加额外的行为。

在Asp.NET Core中,拦截器通常是通过 依赖注入 和 中间件 来模拟的。

两者区别

  1. 应用场景不同:过滤器 主要应用于 MVC 和 Web API 控制器中,而 拦截器 可以应用在任何对象或者数据

  2. 实现方式不同:过滤器 通过 继承 特定的基类实现,而 拦截器 通常通过 动态代理 实现。

  3. 控制粒度不同:过滤器 控制的 粒度更小,像是 Action,而 拦截器 可以对 方法级别 的行为实施拦截。

  4. 性能差异:由于过滤器是在.NET Core的 Pipeline 中实现的,它的性能通常 优于拦截器

示例代码

过滤器(Authentication Filter)

public class MyCustomAuthFilter : Attribute, IAuthenticationFilter
{public Task AuthenticateAsync(AuthenticationContext context){// 自定义认证逻辑return Task.CompletedTask;}public Task ChallengeAsync(AuthenticationChallengeContext context){// 当需要challenge时执行return Task.CompletedTask;}public Task ForbidAsync(AuthenticationForbidContext context){// 当需要forbid时执行return Task.CompletedTask;}
}[MyCustomAuthFilter]
public IActionResult Index()
{return View();
}

拦截器(依赖注入和中间件模拟)

// 定义一个拦截器接口
public interface IMyInterceptor
{Task InvokeAsync(InvocationContext context);
}// 实现拦截器
public class MyInterceptor : IMyInterceptor
{public async Task InvokeAsync(InvocationContext context){// 在调用方法之前执行额外的行为await Next(context); // 调用下一个拦截器或者原方法// 在调用方法之后执行额外的行为}
}// 在中间件中使用
public class MyCustomMiddleware
{private readonly RequestDelegate _next;public MyCustomMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context, IMyInterceptor interceptor){// 在这里调用拦截器await interceptor.InvokeAsync(/* 传递适当的参数 */);// 调用下一个中间件await _next(context);}
}// 注册中间件
public void Configure(IApplicationBuilder app)
{app.UseMiddleware<MyCustomMiddleware>();
}

  现在能区分二者的职责和关系了吧

http://www.lryc.cn/news/490896.html

相关文章:

  • 【笔记】自动驾驶预测与决策规划_Part7_数据驱动的预测方法
  • React渲染相关内容——渲染流程API、Fragment、渲染相关底层API
  • Python中dict支持多个key的方法
  • 丹摩 | 基于PyTorch的CIFAR-10图像分类实现
  • C#变量和函数如何和unity组件绑定
  • AI模型---安装cuda与cuDNN
  • 【大数据学习 | Spark-Core】Spark提交及运行流程
  • 内网渗透横向移动1
  • 现代密码学
  • Pod 动态分配存储空间实现持久化存储
  • Jackson、Gson、FastJSON三款JSON利器比拼
  • php:nginx如何配置WebSocket代理?
  • 3349、检测相邻递增子数组 Ⅰ
  • C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景
  • 怎么只提取视频中的声音?从视频中提取纯音频技巧
  • 数仓工具—Hive语法之窗口函数中的 case when
  • 基于微信小程序的酒店客房管理系统+LW示例参考
  • Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?
  • 【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦
  • CTF之密码学(Polybius密码)
  • 【C++篇】从售票窗口到算法核心:C++队列模拟全解析
  • clipboard
  • 【Mac】VMware Fusion Pro 安装 CentOS 7
  • 游戏引擎学习第22天
  • 洛谷 B2038:奇偶 ASCII 值判断
  • APIRouter
  • 算法模板2:位运算+离散化+区间合并
  • 钉钉授权登录
  • 【视频】二维码识别:libzbar-dev、zbar-tools(zbarimg )
  • C语言中的结构体,指针,联合体的使用