ASP.NET Core MVC 过滤器的使用方法介绍

发布时间 - 2026-01-11 03:22:31    点击率:

过滤器的作用是在 Action 方法执行前或执行后做一些加工处理。使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码。

过滤器如何工作?

过滤器在 MVC Action 调用管道中运行,有时称为过滤器管道。MVC选择要执行的Action方法后,才会执行过滤器管道:

实现

过滤器同时支持同步和异步两种不同的接口定义。您可以根据执行的任务类型,选择同步或异步实现。

同步过滤器定义OnStageExecuting和OnStageExecuted方法,会在管道特定阶段之前和之后运行代码的。例如IActionFilter过滤器,在调用Action方法之前调用OnActionExecuting,在Action方法之回之后调用OnActionExecuted

 public class SampleActionFilter : IActionFilter
 {
  public void OnActionExecuting(ActionExecutingContext context)
  {
   // do something before the action executes
  }

  public void OnActionExecuted(ActionExecutedContext context)
  {
   // do something after the action executes
  }
 }

异步过滤器定义了一个OnStageExecutionAsync方法。该方法提供了FilterTypeExecutionDelegate的委托,当调用该委托时会执行具体管道阶段的工作。例如,ActionExecutionDelegate用于调用Action方法,您可以在调用它之前和之后执行代码。

 public class SampleAsyncActionFilter : IAsyncActionFilter
 {
  public async Task OnActionExecutionAsync(
   ActionExecutingContext context,
   ActionExecutionDelegate next)
  {
   // do something before the action executes
   await next();
   // do something after the action executes
  }
 }

您可以在单个类中实现多个过滤器接口。例如,ActionFilterAttribute抽象类实现了IActionFilter和IResultFilter,以及与它们对应的异步接口。

提示

您不需要同时实现两种过滤器接口,要么是同步的,要么是异步的。框架首先检查过滤器是否实现了异步接口,如果是,直接执行异步方法。如果不是,它会执行同步接口的方法。如果在一个类上同时实现两种接口,则只会调用异步方法。当使用像ActionFilterAttribute这类抽象类时,您只需要覆盖过滤器的同步方法或异步方法。

过滤器类型

ASP.NET Core 有以下五种类型的过滤器,每个过滤器类型在过滤器管道中的不同阶段执行:

1.Authorization Filter

授权过滤器 在过滤器管道中第一个执行,通常用于验证当前请求的合法性,不合法后面的管道会直接跳过。它们只有一个Before方法,不像其它大多数过滤器支持前置阶段方法和后置阶段方法。注意,您不要在授权过滤器中抛出异常,因为没有任何代码来处理异常(异常过滤器不处理它们)。

2.Resource Filter

资源过滤器是第二个运行,在 Authorization Filter 之后,Model Binding 之前执行。在性能方面,资源过滤器在实现缓存或截断过滤器管道尤为重要。

3.Action Filter

使用率最高的过滤器,在调用 Acioin 方法之前和之后执行代码。跟 Resource Filter 很类似,但 Model Binding 在之后执行。

4.Exception Filter

用于为应用程序执行异常处理策略。

5.Result Filter

当 Action 执行完成后,最后会执行过滤器。用于处理ActionResult结果输出策略。

过滤器运行顺序

ASP.NET Core 的每个请求都会先经过已注册的Middleware,接着才会执行过滤器:同类型的过滤器都会以先进后出的方式执行。

黃色箭头是正常情況流程
灰色箭头是异常处理流程

过滤器的作用域与执行顺序

过滤器具有三种不同级别的作用域。您可以通过Attribute将过滤器注册到指定控制器或 Action 方法;您也可以在Startup类的ConfigureServices方法中将过滤器注册到MvcOptions.Filters的集合中作为全局过滤器(对所有的控制器和Action方法均有效):

 public class Startup
 {
  public void ConfigureServices(IServiceCollection services)
  {
   services.AddMvc(options =>
   {
    options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader", 
     "Result filter added to MvcOptions.Filters")); // an instance
    options.Filters.Add(typeof(SampleActionFilter)); // by type
    options.Filters.Add(new SampleGlobalActionFilter()); // an instance
   });

   services.AddScoped<AddHeaderFilterWithDi>();
  }
 }

示例来自于ASP.NET Core MVC 英语文档

默认执行顺序

当管道的某个阶段存在多个过滤器时,过滤器执行的默认顺序由作用域确定:全局过滤器优先于控制器过滤器,控制器过滤器优先于Action方法过滤器。

以下示例是同步 Action 过滤器调用的顺序:

序号 过滤器作用域 过滤器方法
1 Global OnActionExecuting
2 Controller OnActionExecuting
3 Method OnActionExecuting
4 Method OnActionExecuted
5 Controller OnActionExecuted
6 Global OnActionExecuted

提示

每个控制器的基类Controller包含OnActionExecuting和OnActionExecuted方法。其中OnActionExecuting在所有过滤器之前调用,OnActionExecuted在所有过滤器之后调用。

覆盖默认执行顺序

您可以通过实现IOrderedFilter接口来覆盖默认的执行顺序。此接口公开了Order属性表示优先级,以确定执行顺序;具有较低Order值的过滤器将在具有较高Order值的过滤器之前执行前置方法;具有较低Order值的过滤器将在具有较高Order值的过滤器之后执行后置方法。

您可以使用构造函数参数设置Order属性:

[MyFilter(Name = "Controller Level Attribute", Order=1)]

如果您将上述示例中 Action 过滤器的Order设置为1,将控制器和全局过滤器的Order属性分别设置为2和3,则执行顺序将与默认相反。

序号 过滤器作用域 Order 属性 过滤器方法
1 Method 1 OnActionExecuting
2 Controller 2 OnActionExecuting
3 Global 3 OnActionExecuting
4 Global 3 OnActionExecuted
5 Controller 2 OnActionExecuted
6 Method 1 OnActionExecuted

过滤器执行时,Order属性的优先级高于作用域。过滤器首先按Order属性排序,然后再按作用域排序。所有内置过滤器实现IOrderedFilter接口并将Order值默认设置为0;因此,除非设置Order属性为非零值,否则按作用域的优先级执行。

总结

今天我们已经了解了关于过滤器基本知识,在下一篇博客中,我们将介绍内置过滤器、过滤的使用、依赖注入、取消与截断等知识,谢谢!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ASP.NET  # Core  # MVC  # 过滤器  # ASP.NET过滤器的应用方法介绍  # Asp.Net MVC学习总结之过滤器详解  # ASP.NET mvc4中的过滤器的使用  # ASP.NET Core MVC 过滤器(Filter)  # 聊一聊Asp.net过滤器Filter那一些事  # ASP.NET Core MVC中过滤器工作原理介绍  # ASP.NET MVC过滤器执行顺序介绍  # ASP.NET Core中ResourceFilter过滤器的实现  # 您可以  # 两种  # 设置为  # 多个  # 将在  # 才会  # 较高  # 道中  # 较低  # 您不  # 实现了  # 是在  # 抽象类  # 第一个  # 没有任何  # 会在  # 要在  # 只会  # 这类  # 第二个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么上传文件_Laravel图片上传及存储配置  如何用低价快速搭建高质量网站?  如何在腾讯云服务器快速搭建个人网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  如何快速配置高效服务器建站软件?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  微信小程序 input输入框控件详解及实例(多种示例)  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  如何快速生成可下载的建站源码工具?  如何在自有机房高效搭建专业网站?  linux写shell需要注意的问题(必看)  高防服务器租用指南:配置选择与快速部署攻略  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何为不同团队 ID 动态生成多个非值班状态按钮  如何在宝塔面板中创建新站点?  音响网站制作视频教程,隆霸音响官方网站?  如何打造高效商业网站?建站目的决定转化率  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  如何用VPS主机快速搭建个人网站?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel如何实现多对多模型关联?(Eloquent教程)  如何在建站之星网店版论坛获取技术支持?  Bootstrap CSS布局之列表  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  黑客如何通过漏洞一步步攻陷网站服务器?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Laravel如何使用Livewire构建动态组件?(入门代码)  Laravel storage目录权限问题_Laravel文件写入权限设置  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  桂林网站制作公司有哪些,桂林马拉松怎么报名?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何在阿里云ECS服务器部署织梦CMS网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何快速完成中国万网建站详细流程?  详解Android中Activity的四大启动模式实验简述  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何自定义分页视图?(Pagination示例)  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何快速搭建支持数据库操作的智能建站平台?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲