ASP.NET 是. NET FrameWork 的一部分, 是一项微软公司的技术, 是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术, 它可以在通过 HTTP 请求文档时再在 web 服务器上动态创建它们 指 Active Server Pages(动态服务器页面) , 运行于 IIS(Internet Information Server 服务, 是 Windows 开发的 Web 服务器) 之中的程序
本篇文章主要介绍了 ASP.NET Core MVC 过滤器的使用方法介绍, 小编觉得挺不错的, 现在分享给大家, 也给大家做个参考一起跟随小编过来看看吧
过滤器的作用是在 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 属性为非零值, 否则按作用域的优先级执行
来源: http://www.phperz.com/article/18/0319/352307.html