手机版

核心MVC过滤器在ASP中的使用介绍 网

时间:2021-09-03 来源:互联网 编辑:宝哥软件园 浏览:

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

过滤器是如何工作的?

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

实现

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

同步过滤器定义了OnStageExecuting和OnStageExecuted方法,它们在管道的特定阶段之前和之后运行代码。例如,IactionFilter筛选器在调用Action方法之前调用了Actionexecuted,在Action方法返回之后调用了onActionexecuted:

public class SampleActionFilter : IActionFilter { public void on actionexecuting(actionexecuting context){//异步筛选器“在操作执行之前做点什么”} public void on actionexecuted(actioexecutedcontext){//在操作执行之后做点什么”}定义了一个OnStageExecutionAsync方法。该方法提供了FilterTypeExecutionDelegate的委托,当调用该委托时,将执行特定管道阶段的工作。例如,ActionExecutionDelegate用于调用Action方法,您可以在调用它之前和之后执行代码。

public class sampleasynccionfilter : iasynccactionfilter { public async Task on actionexecutionsync(ActionExecutingContext,ActionExecutionDelegate next){//在操作执行之前做点什么,等待下一个();//在动作执行后做一些事情}}您可以在一个类中实现多个过滤器接口。例如,ActionFilterAttribute抽象类实现了IActionFilter和IResultFilter,以及它们对应的异步接口。

给出提示

您不需要同时实现两个过滤器接口,同步的或者异步的。框架首先检查过滤器是否实现了异步接口,如果是,则直接执行异步方法。如果不是,它将执行同步接口的方法。如果两个接口都在一个类上实现,将只调用异步方法。当使用像ActionFilterAttribute这样的抽象类时,您只需要重写筛选器的同步或异步方法。

过滤方式

ASP。NET core有以下五种类型的过滤器,每种过滤器都在过滤器管道的不同阶段执行:

1.授权过滤器

授权过滤器首先在过滤器管道中执行,通常用于验证当前请求的合法性,非法后的管道将被直接跳过。它们只有一个Before方法,不同于大多数其他过滤器,后者支持前阶段方法和后阶段方法。请注意,您不应该在授权过滤器中抛出异常,因为没有处理异常的代码(异常过滤器不处理它们)。

2.资源过滤器

资源过滤器是第二次运行,在授权过滤器之后和模型绑定之前执行。就性能而言,资源过滤器在缓存或截断过滤器管道时尤为重要。

3.动作过滤器

最常用的过滤器在调用Acioin方法之前和之后执行代码。它类似于资源过滤器,但模型绑定稍后执行。

4.异常过滤器

用于执行应用程序的异常处理策略。

5.结果过滤器

当操作被执行时,过滤器将最终被执行。处理操作结果结果的输出策略。

过滤器的运行顺序

来自ASP.NET核心的每个请求都将在执行过滤器之前通过注册的中间件:相同类型的过滤器将以先进先出的模式执行。

黄色箭头表示正常过程,灰色箭头表示异常过程

过滤器的范围和执行顺序

过滤器有三个不同级别的作用域。您可以通过属性将过滤器注册到指定的控制器或操作方法;您也可以在多视图操作中注册过滤器。作为启动类的配置服务方法中的全局筛选器的筛选器集合(对所有控制器和操作方法有效):

公共类Startup { public void ConfigureServices(IServiceCollection services){ services }。AddMvc(选项={ options。过滤器。添加(新的添加头属性('全局添加头','结果过滤器添加到多视图操作。过滤器’);//一个实例选项。过滤器。添加(类型为(样本操作过滤器));//按类型选项。过滤器。添加(新的SampleGlobalActionFilter());//一个实例});服务。addscopededddheaderfilterrwithdi();}}例子来自ASP.NET Core MVC英文文档

默认执行顺序

当管道阶段有多个过滤器时,过滤器执行的默认顺序由范围决定:全局过滤器优先于控制器过滤器,控制器过滤器优先于Action方法过滤器。

以下示例是同步操作过滤器调用的顺序:

序列号筛选器范围筛选器方法1全局操作执行2控制器操作执行3方法操作执行4方法操作执行5控制器操作执行6全局操作执行提示

每个控制器的基类Controller包含一个分区执行和一个分区执行的方法。其中,在所有过滤器之前调用onactionexecuted,在所有过滤器之后调用OnActionExecuted。

覆盖默认执行顺序

您可以通过实现IOrderedFilter接口来覆盖默认的执行顺序。此接口公开Order属性,以指示确定执行顺序的优先级;具有较低顺序值的筛选器将在具有较高顺序值的筛选器之前执行前置方法;具有较低顺序值的筛选器将在具有较高顺序值的筛选器之后执行post方法。

您可以使用构造函数参数设置Order属性:

[my filter(name=' controller level attribute ',Order=1)]如果将Action筛选器的Order设置为1,将controller和全局筛选器的Order属性分别设置为2和3,则执行顺序将与默认值相反。

序列号筛选器作用域Order属性筛选器方法1执行分区执行2控制器2执行分区执行3全局3执行分区执行4全局3执行分区执行5控制器当执行分区执行6方法1筛选器时,Order属性优先于作用域。过滤器首先按Order属性排序,然后按范围排序。所有内置过滤器都实现了IOrderedFilter接口,默认情况下将Order值设置为0;因此,除非Order属性设置为非零值,否则它将根据范围的优先级执行。

摘要

今天,我们学习了过滤器的基本知识。在下一篇博客中,我们将介绍内置过滤器、过滤器的使用、依赖注入、取消和截断等。谢谢大家!

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

版权声明:核心MVC过滤器在ASP中的使用介绍 网是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。