设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

查看: 1511|回复: 4

ASP.NET Core MVC中过滤器工作原理介绍

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:203
  • 打卡月天数:0
  • 打卡总奖励:3127
  • 最近打卡:2023-08-27 09:14:04
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
406
主题
372
精华
0
金钱
4314
积分
810
注册时间
2022-12-25
最后登录
2025-5-31

发表于 2023-12-22 20:30:49 | 显示全部楼层 |阅读模式

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

过滤器如何工作?

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

1.jpeg

实现

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

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

  1. IActionFilter
复制代码
过滤器,在调用Action方法之前调用
  1. OnActionExecuting
复制代码
,在Action方法之回之后调用
  1. OnActionExecuted
复制代码

  1. public class SampleActionFilter : IActionFilter
  2. {
  3. public void OnActionExecuting(ActionExecutingContext context)
  4. {
  5. // do something before the action executes
  6. }
  7. public void OnActionExecuted(ActionExecutedContext context)
  8. {
  9. // do something after the action executes
  10. }
  11. }
复制代码

异步过滤器定义了一个OnStageExecutionAsync方法。该方法提供了FilterTypeExecutionDelegate的委托,当调用该委托时会执行具体管道阶段的工作。例如,

  1. ActionExecutionDelegate
复制代码
用于调用Action方法,您可以在调用它之前和之后执行代码。

  1. public class SampleAsyncActionFilter : IAsyncActionFilter
  2. {
  3. public async Task OnActionExecutionAsync(
  4. ActionExecutingContext context,
  5. ActionExecutionDelegate next)
  6. {
  7. // do something before the action executes
  8. await next();
  9. // do something after the action executes
  10. }
  11. }
复制代码

您可以在单个类中实现多个过滤器接口。例如,ActionFilterAttribute抽象类实现了

  1. IActionFilter
复制代码
  1. IResultFilter
复制代码
,以及与它们对应的异步接口。

  1. <strong>提示</strong>您不需要同时实现两种过滤器接口,要么是同步的,要么是异步的。框架首先检查过滤器是否实现了异步接口,如果是,直接执行异步方法。如果不是,它会执行同步接口的方法。如果在一个类上同时实现两种接口,则只会调用异步方法。当使用像[code]ActionFilterAttribute
复制代码
这类抽象类时,您只需要覆盖过滤器的同步方法或异步方法。[/code]

过滤器类型

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

  • Authorization Filter
    授权过滤器 在过滤器管道中第一个执行,通常用于验证当前请求的合法性,不合法后面的管道会直接跳过。它们只有一个
    1. Before
    复制代码
    方法,不像其它大多数过滤器支持前置阶段方法和后置阶段方法。注意,您不要在授权过滤器中抛出异常,因为没有任何代码来处理异常(异常过滤器不处理它们)。
  • Resource Filter
    资源过滤器是第二个运行,在 Authorization Filter 之后,Model Binding 之前执行。在性能方面,资源过滤器在实现缓存或截断过滤器管道尤为重要。
  • Action Filter
    使用率最高的过滤器,在调用 Acioin 方法之前和之后执行代码。跟 Resource Filter 很类似,但 Model Binding 在之后执行。
  • Exception Filter
    用于为应用程序执行异常处理策略。
  • Result Filter
    当 Action 执行完成后,最后会执行过滤器。用于处理ActionResult结果输出策略。

过滤器运行顺序

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

2.jpeg

  1. 黃色箭头是正常情況流程灰色箭头是异常处理流程
复制代码

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

过滤器具有三种不同级别的作用域。您可以通过

  1. Attribute
复制代码
将过滤器注册到指定控制器或 Action 方法;您也可以在
  1. Startup
复制代码
类的
  1. ConfigureServices
复制代码
方法中将过滤器注册到
  1. MvcOptions.Filters
复制代码
的集合中作为全局过滤器(对所有的控制器和Action方法均有效):

  1. public class Startup
  2. {
  3. public void ConfigureServices(IServiceCollection services)
  4. {
  5. services.AddMvc(options =&gt;
  6. {
  7. options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader",
  8. "Result filter added to MvcOptions.Filters")); // an instance
  9. options.Filters.Add(typeof(SampleActionFilter)); // by type
  10. options.Filters.Add(new SampleGlobalActionFilter()); // an instance
  11. });
  12. services.AddScoped&lt;AddHeaderFilterWithDi&gt;();
  13. }
  14. }
复制代码

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

默认执行顺序

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

序号过滤器作用域过滤器方法
1Global
  1. OnActionExecuting
复制代码
2Controller
  1. OnActionExecuting
复制代码
3Method
  1. OnActionExecuting
复制代码
4Method
  1. OnActionExecuted
复制代码
5Controller
  1. OnActionExecuted
复制代码
6Global
  1. OnActionExecuted
复制代码
  1. <strong>提示</strong>每个控制器的基类[code]Controller
复制代码
包含
  1. OnActionExecuting
复制代码
  1. OnActionExecuted
复制代码
方法。其中
  1. OnActionExecuting
复制代码
在所有过滤器之前调用,
  1. OnActionExecuted
复制代码
在所有过滤器之后调用。[/code]

覆盖默认执行顺序

您可以通过实现

  1. IOrderedFilter
复制代码
接口来覆盖默认的执行顺序。此接口公开了
  1. Order
复制代码
属性表示优先级,以确定执行顺序;具有较低
  1. Order
复制代码
值的过滤器将在具有较高
  1. Order
复制代码
值的过滤器之前执行前置方法;具有较低
  1. Order
复制代码
值的过滤器将在具有较高
  1. Order
复制代码
值的过滤器之后执行后置方法。
您可以使用构造函数参数设置
  1. Order
复制代码
属性:

  1. [MyFilter(Name = "Controller Level Attribute", Order=1)]
复制代码

如果您将上述示例中 Action 过滤器的

  1. Order
复制代码
设置为1,将控制器和全局过滤器的
  1. Order
复制代码
属性分别设置为2和3,则执行顺序将与默认相反。

序号过滤器作用域
  1. Order
复制代码
 属性
过滤器方法
1Method1
  1. OnActionExecuting
复制代码
2Controller2
  1. OnActionExecuting
复制代码
3Global3
  1. OnActionExecuting
复制代码
4Global3
  1. OnActionExecuted
复制代码
5Controller2
  1. OnActionExecuted
复制代码
6Method1
  1. OnActionExecuted
复制代码

过滤器执行时,

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

到此这篇关于ASP.NET Core MVC中过滤器工作原理的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持晓枫资讯。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2024-9-2 07:59:40 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-23
最后登录
2022-12-23

发表于 2024-10-26 19:36:04 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-3-4 11:40:25 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2024-11-24
最后登录
2024-11-24

发表于 2025-12-9 23:22:40 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

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