.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>();
}

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

相关推荐
csdn_aspnet1 天前
ASP.NET Core:使用 JavaScript 加密并在控制器中解密
javascript·asp.net·.netcore
武藤一雄1 天前
从零构建C# OOP 知识体系
windows·microsoft·c#·.net·.netcore·oop
武藤一雄7 天前
C#常见面试题100问 (第一弹)
windows·microsoft·面试·c#·.net·.netcore
猹叉叉(学习版)9 天前
【ASP.NET CORE】 14. RabbitMQ、洋葱架构
笔记·后端·架构·c#·rabbitmq·asp.net·.netcore
Murphy202311 天前
.NetCore项目使用EF Core操作SQL Server
.netcore
码界奇点11 天前
基于.NET Core的CMS内容管理系统设计与实现
c++·毕业设计·.netcore·源代码管理
猹叉叉(学习版)11 天前
【ASP.NET CORE】 13. DDD初步实现
笔记·后端·架构·c#·asp.net·.netcore
武藤一雄11 天前
WPF Command 设计思想与实现剖析
windows·微软·c#·.net·wpf·.netcore
武藤一雄11 天前
WPF 资源解析:StaticResource & DynamicResource 实战指南
微软·c#·.net·wpf·.netcore
武藤一雄11 天前
WPF UI 开发深度指南:资源 (Resources)、样式 (Style) 与触发器 (Trigger) 全解析
ui·c#·.net·wpf·.netcore·avalonia