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属性为非零值,否则按作用域的优先级执行。

总结

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

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

(0)

相关推荐

  • asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1)

    本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过

  • asp.net core MVC 过滤器之ActionFilter过滤器(2)

    本系类将会讲解asp.net core MVC中的内置过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过滤器

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

    过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码. 过滤器如何工作? 过滤器在 MVC Action 调用管道中运行,有时称为过滤器管道.MVC选择要执行的Action方法后,才会执行过滤器管道: 实现 过滤器同时支持同步和异步两种不同的接口定义.您可以根据执行的任务类型,选择同步或异步实现. 同步过滤器定义OnStageExecuting和OnStageExecuted方法,会在管道特定

  • ASP.NET Core MVC 过滤器(Filter)

    目录 一.过滤器如何工作 1.选择过滤器 2.实现过滤器 3.过滤器作用域 4.取消和短路 二.配置过滤器 1.依赖注入 2.排序 3.对比中间件 一.过滤器如何工作 不同的过滤器类型在管道中的不同阶段执行,因此具有各自的与其场景.根据需要执行的任务以及需要执行的请求管道中的位置,选择要创建的过滤器类型.过滤器在 MVC 操作调用管道中运行,有时也称为过滤管道,在 MVC 中选择要执行的操作后,执行操作上的过滤器,如图: 不同的过滤器在管道内的不同位置执行.像授权过滤器这样的过滤器只在管道中靠前

  • 在ASP.NET Core Mvc集成MarkDown的方法

    这几天在做文章编辑,首先就想到了markdown,它比其它的都要新,而且很好用,相对于其它的html编辑器,好久不更新,要好得多,哦~对了我现在已经用上新版的Edge了,经过很多朋友测试,性能比谷歌浏览器都要好很多,并且资源消耗也相对来说小. 一.前提 好吧,言归正传,你首先需要下载MarkDown的相关样式脚本资源,下载完毕之后拖放你的ASP.NET Core Mvc 项目中的wwwroot中. 二.初始化 在页面中我们理所当然需要引用css 脚本资源,随后调用它的初始化方法. <script

  • ASP.NET Core MVC中的控制器(Controller)介绍

    操作(action)和操作结果(action result)是 ASP.NET MVC 构建应用程序的一个基础部分.在 ASP.NET MVC 中,控制器用于定义和聚合一组操作.操作是控制器中处理传入请求的一种方法.控制器提供了一种逻辑方式,将相似的操作组织起来,允许一些通用的规则(例如路由,缓存,授权)使用共同的应用.传入的请求通过 路由 映射到操作.ASP.NET Core MVC 中,控制器可以是任何以 “Controller” 结尾或继承自以 “Controller” 结尾的可实例化类.

  • ASP.NET Core MVC自定义Tag Helpers用法介绍

    介绍 在之前的内容中,我们谈到了Tag Helpers,我们还谈到了 caching Tag Helpers和form Tag Helpers. 通过创建自定义Tag Helpers,我们可以扩展现有元素或创建我们自己的元素. Tag Helper是实现ITagHelper接口类的统称.MVC为我们提供了该接口的抽象类TagHelper,它位于 Microsoft.AspNetCore.Razor.Runtime 程序集中.因此,我们可以直接从TagHelper类继承,我们主要需要实现以下方法:

  • ASP.NET Core MVC中Tag Helpers用法介绍

    简介 Tag Helpers 提供了在视图中更改和增强现有HTML元素的功能.将它们添加到视图中,会经过Razor模板引擎处理并创建一个HTML,之后再返回给浏览器.有一些Tag Helpers,其实作为元素或实际的标签(如environment,cache等). 它们使用HTML方式编写,同时利用了Razor的强大功能.C#的简洁和HTML的友好性.由于使用Tag Helpers感觉如此自然,看起来像标准的HTML,前端开发人员也可以轻松地适应,不需要学习C#语法:此外,它们可以在现有元素范围

  • ASP.NET Core MVC中的视图(Views)

    目录 1.什么是视图 2.创建视图 3.控制器指定视图 4.给视图传递数据 1.弱类型数据 2.动态视图 5.更多视图特性 ASP.NET Core MVC 控制器可以使用视图返回格式化的结果. 1.什么是视图 在 MVC 中,视图封装了用户与应用交互呈现细节.视图是具有生成要发送到客户端内容的,包含嵌入代码的HTML模板.视图使用使用 Razor 语法,该语法允许以最少的代码或复杂度与 HTML 进行交互. ASP.NET Core MVC 视图默认以 .cshtml 文件保存在应用程序的 V

  • ASP.NET Core MVC路由(Routing)的用法

    目录 1.设置路由中间件 2.常规路由 3.多路由 1.回退 2.行动歧义 3.路由名称 4.路由特性 5.组合路由 6.特性路由的顺序 7.路由模板中的标记替换( [controller] , [action] , [area]) 8.使用IRouteTemplateProvider自定义路由特性 9.使用应用程序模型来自定义特性路由 10.URL生成 11.通过操作名生成URL 12.通过路由名生成URL 13.在操作结果中生成URL 14.专用常规路由的特殊情况 15.区域 16.IAct

  • ASP.NET Core MVC中的局部视图用法

    目录 1.什么是局部视图 2.什么时候使用局部视图 3.引用局部视图 4.发现局部视图 5.局部视图访问数据 6.简单实战 1.什么是局部视图 局部视图是在其他视图中呈现的视图.通过执行局部视图生成的HTML输出呈现在调用视图中.与视图一样,局部视图使用 .cshtml 文件扩展名.当希望在不同视图之间共享网页的可重用部分时,就可以使用局部视图. 2.什么时候使用局部视图 局部视图是将大视图分成小组件的有效方法.通用的布局元素应在 _Layout.cshtml 中指定,非布局可重用内容可以封装成

随机推荐