ASP.NET Core 中,操作过滤器(Action Filters)

news/2025/2/4 14:29:15/文章来源:https://www.cnblogs.com/51net/p/18698188

ASP.NET Core 中,操作过滤器(Action Filters)用于在控制器的操作方法执行之前或之后执行自定义逻辑。操作过滤器主要用于在请求到达控制器方法之前进行处理(例如:验证请求参数、设置数据)、在操作执行后处理响应(例如:记录日志、修改响应结果)等。

操作过滤器的工作原理

操作过滤器可以通过实现IActionFilter 接口或继承ActionFilterAttribute 来创建。它们可以用于对操作方法的输入和输出进行拦截,在执行请求之前或之后进行特定操作。

操作过滤器的执行时机是:

  • 执行前:在控制器操作方法执行之前。
  • 执行后:在控制器操作方法执行之后,但在返回结果给客户端之前。

操作过滤器的实现方式

1. 使用IActionFilter 接口

你可以通过实现IActionFilter 接口来创建一个自定义的操作过滤器。IActionFilter 接口包含两个方法:

  • OnActionExecuting(ActionExecutingContext context):在操作方法执行之前调用。
  • OnActionExecuted(ActionExecutedContext context):在操作方法执行之后调用。
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;

publicclassMyActionFilter : IActionFilter
{
    privatereadonly ILogger<MyActionFilter> _logger;

    public MyActionFilter(ILogger<MyActionFilter> logger)
    {
        _logger = logger;
    }

    // 在操作执行之前调用
    public void OnActionExecuting(ActionExecutingContext context)
    {
        _logger.LogInformation("OnActionExecuting: {ActionName}", context.ActionDescriptor.DisplayName);
        // 你可以在这里进行请求参数的验证或其他预处理操作
    }

    // 在操作执行之后调用
    public void OnActionExecuted(ActionExecutedContext context)
    {
        _logger.LogInformation("OnActionExecuted: {ActionName}", context.ActionDescriptor.DisplayName);
        // 在这里进行操作后的处理(例如:修改结果、记录日志等)
    }
}

2. 使用ActionFilterAttribute 特性类

ASP.NET Core 还提供了一个基类ActionFilterAttribute,它实现了IActionFilter 接口。你可以通过继承这个类来创建自定义的操作过滤器。这样,你就可以通过特性标记来应用过滤器。

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;

publicclassMyActionFilterAttribute : ActionFilterAttribute
{
    privatereadonly ILogger<MyActionFilterAttribute> _logger;

    public MyActionFilterAttribute(ILogger<MyActionFilterAttribute> logger)
    {
        _logger = logger;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        _logger.LogInformation("OnActionExecuting: {ActionName}", context.ActionDescriptor.DisplayName);
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        _logger.LogInformation("OnActionExecuted: {ActionName}", context.ActionDescriptor.DisplayName);
        base.OnActionExecuted(context);
    }
}

3. 应用操作过滤器

  • 应用于控制器或操作方法:你可以通过[ServiceFilter] 或[TypeFilter] 特性将自定义的操作过滤器应用于特定的控制器或方法。

    • 使用ActionFilterAttribute 的方式:

      [MyActionFilterAttribute]
      public class HomeController : Controller
      {
          public IActionResult Index()
          {
              return View();
          }
      }
    • 使用ServiceFilter 或TypeFilter 特性来注入服务:

      [ServiceFilter(typeof(MyActionFilter))]
      public class HomeController : Controller
      {
          public IActionResult Index()
          {
              return View();
          }
      }

      ServiceFilter 用于注入已注册的服务类型;TypeFilter 允许指定一个类型,可以通过构造函数来创建。

4. 在Startup.cs 中注册操作过滤器

如果你想全局使用自定义的操作过滤器,可以在Startup.cs 文件中的ConfigureServices 方法中进行注册:

public void ConfigureServices(IServiceCollection services)
{
    // 注册自定义过滤器
    services.AddScoped<MyActionFilter>(); // 如果你使用了 ServiceFilter 特性,记得注册依赖注入

    // 全局添加过滤器
    services.AddControllersWithViews(options =>
    {
        options.Filters.Add<MyActionFilter>(); // 这会将 MyActionFilter 应用到所有控制器和操作
    });
}

操作过滤器的使用场景

操作过滤器的使用场景非常广泛,通常用来处理以下任务:

  1. 日志记录:记录每个请求的相关信息。

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        _logger.LogInformation($"Executing action {context.ActionDescriptor.DisplayName}");
    }
  2. 验证请求数据:例如,验证请求的参数是否符合预期。

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var parameter = context.ActionArguments["id"];
        if (parameter == null || (int)parameter <= 0)
        {
            context.Result = new BadRequestObjectResult("Invalid ID");
        }
    }
  3. 修改响应结果:操作方法执行后,可以对返回的结果进行修改。

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        if (context.Result is ViewResult viewResult)
        {
            viewResult.ViewData["CustomData"] = "This is added by the filter.";
        }
    }
  4. 缓存处理:为请求添加缓存逻辑。

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var cacheKey = GenerateCacheKey(context);
        var cachedData = _cache.Get(cacheKey);
        if (cachedData != null)
        {
            context.Result = new JsonResult(cachedData);
        }
    }
  5. 权限检查:例如检查当前用户是否具有访问某些资源的权限。

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!_userHasPermission)
        {
            context.Result = new ForbidResult();
        }
    }

异步操作过滤器

如果你需要在操作执行前或后执行异步操作(如访问数据库或外部 API),你可以实现IAsyncActionFilter 接口。它有两个方法:

  • OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next):该方法是异步的,允许你在执行操作前或后进行异步操作。
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

publicclassMyAsyncActionFilter : IAsyncActionFilter
{
    privatereadonly ILogger<MyAsyncActionFilter> _logger;

    public MyAsyncActionFilter(ILogger<MyAsyncActionFilter> logger)
    {
        _logger = logger;
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        _logger.LogInformation("OnActionExecutionAsync: Before Action Execution");
        
        // 执行操作之前的逻辑(如果需要)
        var resultContext = await next();  // 调用控制器操作方法

        _logger.LogInformation("OnActionExecutionAsync: After Action Execution");

        // 执行操作之后的逻辑(如果需要)
    }
}

小结

  • 操作过滤器 是在控制器方法执行之前或之后执行自定义逻辑的强大工具。
  • 你可以通过实现IActionFilter 或继承ActionFilterAttribute 类来创建操作过滤器。
  • 操作过滤器可以用于多种场景,如日志记录、参数验证、响应修改、权限检查等。
  • 它们可以通过[ServiceFilter][TypeFilter][ActionFilter] 特性应用到单个控制器或操作,也可以在Startup.cs 中配置为全局过滤器。
  • 异步操作过滤器(IAsyncActionFilter)适用于需要执行异步操作的场景。

使用操作过滤器可以将额外的逻辑从控制器中抽离出来,使得代码更加清晰和易于维护。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878543.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 中间件(Middleware)

在ASP.NET Core 中,中间件是用来处理 HTTP 请求和响应管道的组件。中间件的核心思想是通过一个链式的管道处理请求和响应,每个中间件既可以处理请求或响应,也可以将其传递给下一个中间件。以下是详细解释:1. 中间件是什么? 中间件是一个软件组件,用于在 HTTP 请求到达应用…

elf2部署官方yolov5模型

ELF2开发板(飞凌嵌入式)搭建深度学习环境部署(RKNN环境部署)本人主要介绍用于elf2的rk3588开发板的深度学习环境的搭建,和官方的方法不同,对于新手比较友好。零基础即可搭建,本人使用的是WSL2系统,当然使用虚拟机也是可以的,本人主要教学搭建yolov5模型转换为rknn的环…

ASP.NET Core 中授权过滤器(Authorization Filters)

在ASP.NET Core 中,授权过滤器(Authorization Filters)是用于在请求到达控制器操作方法之前,验证用户是否具有执行该操作的权限的一种机制。授权过滤器的主要作用是确保用户在访问控制器或操作方法时,已通过身份验证并且有足够的权限。 授权过滤器的工作原理 授权过滤器在…

Roo Code插件搭配DeepSeek快速创建项目示例

一、环境准备 1. 安装VSCode 访问 Visual Studio Code官网 下载并安装最新版本 2. 安装IDEA(运行Java项目) 访问IDEA官网下载并安装最新Community社区版二、Roo Code插件配置 1. 安装插件打开VSCode扩展市场(Ctrl+Shift+X) 搜索 "Roo Code" 安装官方插件(确认发…

电子书查找阅读教程

免责声明本文仅作学习交流,对于喜欢的作者,建议支持正版。软件下载Github发布地址:https://github.com/gedoor/legado/releases 完整教学:https://www.yuque.com/legado/wiki/xz直接浏览器打开选择最新版本下载即可书源导入喵工资订阅源:https://dy.miaogongzi.cc/直接浏览…

性能测试会被AI替代吗?

最近,deepseek火了,不少测试小伙伴忧心忡忡,担心测试岗位被替代 我个人观点是:经验类测试技术短期内还是很难被替代的。大家也可以问问deepseek或者其它ai,我们来看下deepseek的观点: 附文字版:性能测试是否会被AI替代,取决于具体的测试场景、技术发展阶段以及人类与…

Java Stream 流

目录概述StreamOptional开始管道中间管道(中间操作)终止管道(终端操作)常用的 Stream 操作方法匹配(Match)查找(Find)遍历(ForEach)过滤(Filter)映射(Map)扁平映射(FlatMap)截断(Limit)跳过(Skip)排序(Sorted)去重(Distinct)汇总(Collect)归约(Redu…

R9000P能连接wifi但无法上网

问题描述:前一晚还正常使用,第二天打开就不能上网,可以连接WiFi,切换过不同WiFi都一样,排除WiFi原因,此时浏览器显示找不到DNS,估计就是dns解析出了问题 解决办法:先去CMD下,输入ipconfig /flushdns 再控制面板->网络和Internet->找到下图,点击WLAN点击属性,双…

PCIe扫盲——TLP Header详解(二)

下面用几个具体的例子来讲解TLP Header的格式与作用。因为内容较多,所以分为多篇文章分别进行介绍。第一篇(即本文)介绍IO Request、Memory Request和Configuration Request。第二篇文章(即TLP Header详解三)介绍Completion ,第三篇文章(即TLP Header详解四)介绍Messag…

PCIe扫盲——TLP Header详解(一)

事务层包(TLP)的一般格式如下图所示:前面的文章介绍过,TLP Header为3DW或者4DW,Data Payload为1-1024DW,最后的TLP Digest(ECRC)是可选的,为1DW。 TLP Header在整个TLP的位置如下图所示,需要注意的是,TLP Header的格式和内容都会随着TLP的类型和路由方式的改变而改变…

龙哥量化:deepseek写技术指标,deepseek写选股公式,通达信deepseek写公式太牛了

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔) 2025的deepseek火出天际了,用来写技术指标,量化策略岂不是爽歪歪,哈哈 先说使用体验, 第一:写代码确实很强,…