解说asp.net core MVC 过滤器的执行顺序

asp.net core MVC 过滤器会在请求管道的各个阶段触发。同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等。以ActionFilter为例,我们来看看过滤器的触发顺序。

过滤器可注册范围

  • 全局:将作用于所有请求的action
  • controller:将作用于这个controller下的所有action
  • action:作用于单个action

定义过滤器

全局

public class GlobalActionFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate
next)
    {
        var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
        var logger = factory.CreateLogger<GlobalActionFilter>();
        logger.LogWarning("全局ActionFilter执行之前");
        await next();
        logger.LogWarning("全局ActionFilter执行之后");
    }
}

controller(分为注解方式和重写方式)

注解方式:

public class ControllerActionFilter : ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
        var logger = factory.CreateLogger<GlobalActionFilter>();
        logger.LogWarning("ControllerActionFilter执行之前");
        await next();
        logger.LogWarning("ControllerActionFilter执行之后");
    }
}

重写方式(在controller内重写OnActionExecutionAsync)

public override async Task OnActionExecutionAsync(ActionExecutingContext context,
ActionExecutionDelegate next)
{
    var logger = _factory.CreateLogger<ValuesController>();
    logger.LogWarning("Controller内部重写的actionFinter执行前");
    await next();
    logger.LogWarning("Controller内部重写的actionFinter执行后");
}

应用过滤器

全局(在Startup中修改)

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(o =>
    {
        o.Filters.Add<GlobalActionFilter>();
    });
}

controller(重写方式直接可用不用操作)

[ControllerActionFilter]
public class ValuesController : Controller

Action

[HttpGet]
[ActionActionFilter]
public IEnumerable<string> Get()

执行结果

从结果可以看出,Controller重写 > 全局 > Controller > Action

自定义过滤器执行顺序

过滤器的执行顺序不是一成不变的,aspNet Core 通过灵活的设计让我们可以手动自定义过滤器的执行顺序。要实现自定义过滤器执行顺序则需要实现IOrderedFilter接口,该接口定义一个int类型的Order属性,这个属性越大则执行顺序越滞后。

实现IOrderFilter接口

public class GlobalActionFilter : IAsyncActionFilter,IOrderedFilter
{
    public int Order => 0;

继承Attribute方式直接传入参数

 [ControllerActionFilter(Order =-1)]
 public class ValuesController : Controller
 {
[HttpGet]
[ActionActionFilter(Order =-2)]
public IEnumerable<string> Get()
{

结果

此时的执行顺序:controller内部重写 > Action > controller > global

时间: 2024-10-20 21:40:02

解说asp.net core MVC 过滤器的执行顺序的相关文章

ASP.NET Core MVC 过滤器介绍

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

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

本系类将会讲解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 全局过滤器之ExceptionFilter过滤器(一)

本系类将会讲解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 例子——过滤器

目录: 过滤器介绍 过滤器类别 自定义过滤器和过滤特性 直接短路返回内容 过滤器与中间件的区别 如果要全局日志,不要用过滤器 官方文档传送门 1.过滤器介绍 没有权限直接返回,资源缓存,Action执行前执行后过滤,异常定制化处理,结果定制化处理 等一些操作都可以用过滤器.而且能省去不少代码 官方解释:ASP.NET Core MVC中的过滤器允许您在请求处理管道中的某些阶段之前或之后运行代码 2.过滤器类别[直接引用官方解释] 每个过滤器类型在过滤器管道中的不同阶段执行. 授权过滤器首先运行,

ASP.NET Core Mvc中空返回值的处理方式

原文地址:https://www.strathweb.com/2018/10/convert-null-valued-results-to-404-in-asp-net-core-mvc/ 作者: Filip W. 译者: Lamond Lu .NET Core MVC在如何返回操作结果方面非常灵活的. 你可以返回一个实现IActionResult接口的对象, 比如我们熟知的ViewResult, FileResult, ContentResult等. [HttpGet] public IAct

ASP.NET Core MVC 之控制器(Controller)

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

ASP.NET Core MVC 在linux上的创建及发布

前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲试,准备搞一下ASP.NET Core mvc的创建和部署,于是便有了这篇文章,希望能够帮助到你. 环境准备 这是我的开发环境,使用的nginx是nginx 1.6.3 直接yum install,然后需要安装dotnet环境,可以参照官网教程https://www.microsoft.com/ne

Pro ASP.NET Core MVC 6th 第三章

第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解本章中讨论的一些想法和约定,特别是如果您已经完成了高级ASP.NET或C#开发. 如果没有,我鼓励你仔细阅读 - 深入地理解隐藏在MVC背后的东西可以帮助你在通读本书时更好地与MVC框架的功能联系起来. MVC的历史 模型视图控制器模式起源于20世纪70年代后期,来自施乐PARC的Smalltalk

Pro ASP.NET Core MVC 第6版 第二章(后半章)

增加动态输出 整个web应用平台的关注点在于构建并显示动态输出内容.在MVC里,控制器负责构建一些数据并将其传给视图.视图负责渲染成HTML. 从控制器向视图传递数据的一种方式是使用ViewBag 对象,它是一个控制器基类的成员.ViewBag是一个动态对象,你可以给他赋值任意属性给视图来渲染用.代码2-5 演示了如何在HomeController里传递简单对象. Listing 2-5. 设置视图数据 using System; using Microsoft.AspNetCore.Mvc;