ASP.NET Core MVC 过滤器介绍
来源:互联网 发布:得力考勤机删除数据 编辑:程序博客网 时间:2024/06/05 16:41
过滤器的作用是在 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 有以下五种类型的过滤器,每个过滤器类型在过滤器管道中的不同阶段执行:
Authorization Filter
授权过滤器 在过滤器管道中第一个执行,通常用于验证当前请求的合法性,不合法后面的管道会直接跳过。它们只有一个Before
方法,不像其它大多数过滤器支持前置阶段方法和后置阶段方法。注意,您不要在授权过滤器中抛出异常,因为没有任何代码来处理异常(异常过滤器不处理它们)。Resource Filter
资源过滤器是第二个运行,在 Authorization Filter 之后,Model Binding 之前执行。在性能方面,资源过滤器在实现缓存或截断过滤器管道尤为重要。Action Filter
使用率最高的过滤器,在调用 Acioin 方法之前和之后执行代码。跟 Resource Filter 很类似,但 Model Binding 在之后执行。Exception Filter
用于为应用程序执行异常处理策略。Result Filter
当 Action 执行完成后,最后会执行过滤器。用于处理ActionResult结果输出策略。
过滤器运行顺序
ASP.NET Core 的每个请求都会先经过已注册的Middleware
,接着才会执行过滤器:同类型的过滤器都会以先进后出的方式执行。
图片来自 John Wu 的博客
黃色箭头是正常情況流程
灰色箭头是异常处理流程
过滤器的作用域与执行顺序
过滤器具有三种不同级别的作用域。您可以通过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 过滤器调用的顺序:
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
属性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
属性为非零值,否则按作用域的优先级执行。
总结
今天我们已经了解了关于过滤器基本知识,在下一篇博客中,我们将介绍内置过滤器、过滤的使用、依赖注入、取消与截断等知识,谢谢!
参考资料
https://blog.johnwu.cc/article/asp-net-core-filters.html
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters
原文地址:http://www.cnblogs.com/tdfblog/p/filters-in-aspnet-core-mvc.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
- ASP.NET Core MVC 过滤器介绍
- asp.net core MVC 过滤器之ActionFilter过滤器(二)
- asp.net core MVC 过滤器之ExceptionFilter过滤器(一)
- asp.net core MVC 过滤器之ActionFilter过滤器(二)
- asp.net core MVC 过滤器之ActionFilter过滤器(二)
- asp.net core MVC 过滤器之ExceptionFilter过滤器(一)
- ASP.NET Core MVC Tag Helpers 介绍
- ASP.NET MVC过滤器
- asp.net mvc 过滤器
- ASP .NET MVC过滤器
- asp.net core mvc权限控制:权限控制介绍
- ASP.NET Core 介绍
- ASP.NET Core 介绍
- asp.net mvc 过滤器:ArgumentNotNullFilter
- ASP.NET MVC 过滤器Filter
- ASP.NET MVC动作过滤器
- ASP.NET MVC 过滤器Filter
- ASP.NET MVC 过滤器(一)
- 微服务中的异步消息通讯
- .NET Core 事件总线,分布式事务解决方案:CAP
- AOP in dotnet :AspectCore的参数拦截支持
- NavigationView的点击事件失效原因和解决方案
- .NET Core快速入门教程 4、使用VS Code开发.NET Core控制台应用程序
- ASP.NET Core MVC 过滤器介绍
- Autofac+Castle实现AOP事务
- .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
- .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
- ASP.NET Core 开源论坛项目 NETCoreBBS
- docker学习之-docker mac安装
- Visual Studio Code: 利用 MSSQL 插件创建数据库 IDE
- lldb 调试 linux下 .net Core 总结及开源扩展 yinuo
- .NET Core快速入门教程 1、开篇:说说.NET Core的那些事儿