如何在 ASP.NET Core 中使用 ActionFilter

01/02 12:33
阅读数 28

ASP.NET Core MVC 中的 Filters 允许我们在 请求处理管道 中的某一个阶段的之前和之后执行自定义代码,不同类型的 filter 对应着 请求处理管道 的不同阶段,比如说:ActionFilter 可以在 Action 方法的之前或者之后执行自定义代码,这篇文章我们就来讨论 ASP.NET Core MVC 中内建的 ActionFilter,为什么它非常有用以及在程序中如何使用它。

Filter 过滤器

其实在 ASP.NET Core MVC 中有很多的内建 filter,大体罗列如下:

  • ActionFilters

它会在 Action 方法的执行前和执行后 执行。

  • AuthorizationFilters

它会在 请求处理管道 的开始处被执行,主要用来获取用户的 凭证信息 来验证用户是否被授权。

  • ResourceFilters

它会在 authorization 之后 和 模型绑定 之前被执行,可以利用它实现一些缓存逻辑。

  • ExceptionFilters

它会捕捉到 请求处理管道 中的所有异常,所以可用它来实现一些自定义的异常处理。

到底用哪一种类型的 filter,还是取决于你到底想实现什么业务,举个例子,如果你想 短路 request,提前结束 pipeline 管道返回结果,是不是就可以用 ResourceFilters 哈,再举一个例子,如果你想修改 Action 的入参 并且想对 Action 的结果进行修改,那么 ActionFilter 就是你的最佳选择。

ASP.NET Core MVC 中有一个特性叫 ActionFilterAttribute,它实现了如下接口 IActionFilter, IAsyncActionFilter, IResultFilter, IAsyncResultFilter, IOrderedFilter,可以利用它实现不同层级的Filter,如:Action级,Controller级,全局级,稍后我们将会一一讨论。

创建自定义的 ActionFilter

你可以利用自定义的 ActionFilter 在 Action 方法的前后执行一些可复用的逻辑,或许大家都知道,这就是所谓的 AOP 编程,除了 ActionFilterAttribute ,还有其他几个 Filter 也有类似的 Attribute。

  • ResultFilterAttribute

  • ExceptionFilterAttribute

  • ServiceFilterAttribute

  • TypeFilterAttribute

除了上面这些快捷特性,最简单粗暴的就是实现 IActionFilter 接口 ,还可以实现 同步异步 双模式。

创建同步的 ActionFilter

下面的代码片段展示了如何创建同步模式的 ActionFilter,继承 IActionFilter 接口并实现它的 OnActionExecutingOnActionExecuted 两个方法。


    public class SimpleActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //this method will be executed before execution of an action method 
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            //this method will be executed after an action method has executed 
        }
    }

创建异步模式的 ActionFilter

下面的代码片段展示了如何创建异步模式的 ActionFilter,继承 IAsyncActionFilter 接口并实现它的 OnActionExecutionAsync 方法。


    public class SimpleAsyncActionFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context,
          ActionExecutionDelegate next)
        {
            //code written here will be executed before execution of an action method 
            await next();
            //code written here will be executed after execution of an action method 
        }
    }

配置 ActionFilter

文章之前也说过了,可以将 filter 过滤器 添加到不同级别的作用域中,这些作用域包括:action级, controller级,global级,这里就来演示如何将 filter 添加到 global级 ,仔细观察一下我的 自定义filter 是如何添加到 ConfigureServices 方法下的 filter集合 中,如下代码所示:


        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options =>
            {
                options.Filters.Add(new SimpleAsyncActionFilter());
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

除了上面的方法,还可以用 typeof 的方式加入到 options 中,如下代码所示:


        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options =>
            {
                options.Filters.Add(typeof(SimpleAsyncActionFilter));
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

总结一下:过滤器允许我们在 请求处理管道 中的某一个点的前后执行一些自定义代码,而且 ActionFilter 还有一个非常大的新改进是可以在 Http 请求管道中指定过滤器的执行顺序,关于更多的 filter 的高级特性,我会在后面的文章中和大家一起分享。

译文链接:https://www.infoworld.com/article/3328648/how-to-use-action-filters-in-aspnet-core-mvc.html

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部