欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-01-01 21:37:10
过滤器的作用是在 action 方法执行前或执行后做一些加工处理。使用过滤器可以避免action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码。 过滤器如何...

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

过滤器如何工作?

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

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

实现

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

同步过滤器定义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,接着才会执行过滤器:同类型的过滤器都会以先进后出的方式执行。

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

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

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

过滤器具有三种不同级别的作用域。您可以通过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属性为非零值,否则按作用域的优先级执行。

总结

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

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

上一篇:

下一篇: