.NET CORE 五大过滤器

一、五大过滤器

1.授权过滤器

(1) 说明:它是过滤器管道中第一个过滤器,控制对方法的访问,仅有在它之前执行的方法,没有之后;在授权过滤器中不会处理异常, 异常过滤器也捕获到其中产生的异常,因此要小心应对。

(2) 实现:继承Attribute类,实现IAuthorizationFilter接口,重写OnAuthorization方法。

注:继承Attribute类的目的是可以该过滤器以特性的形式作用于Controller或Action,下面过滤器都类似,不再说明。

(3).用途:通常用来做权限校验(详见下面案例应用)。

2. 资源过滤器

(1) 说明:只有授权过滤器在资源过滤器之前运行,里面的OnResourceExecuting重写是在创建控制器调用的。

(2) 实现:继承Attribute类,实现IResourceFilter接口,重写OnResourceExecuting 和 OnResourceExecuted方法。

 (异步的话实现IAsyncResourceFilter接口,重写OnResourceExecutionAsync方法)

(3) 用途:做一些对变化要求不高的页面的缓存(详见下面案例应用)。

3. 操作过滤器(行为过滤器)

(1) 说明:分别在操作方法之前和之后执行

(2) 实现:继承Attribute类,实现IActionFilter接口,重写OnActionExecuting 和 OnActionExecuted方法。 或者直接继承ActionFilterAttribute类,观察源码可知,该类继承了Attribute类,而且还实现IActionFilter,IResultFilter接口。(异步的话实现IAsyncActionFilter接口,重写OnActionExecutionAsync方法)

4. 结果过滤器

(1) 说明:在方法执行前后,且操作过滤器之后;结果(如:页面渲染)的前后运行。

(2) 实现:继承Attribute类,实现IResultFilter接口,重写OnResultExecuting 和 OnResultExecuted方法。 或者直接继承ResultFilterAttribute类,(或ActionFilterAttribute类), 观察源码可知,该类继承了Attribute类,而且还实现IResultFilter接口。(异步的话实现IAsyncActionFilter接口, 重写OnActionExecutionAsync方法) 还可以实现:IAlwaysRunResultFilter 或 IAsyncAlwaysRunResultFilter 接口。

(3).用途:可以获取action的返回结果,进行一些处理,比如:根据要求返回json数据或jsonp数据(详见cors章节)。

5. 异常过滤器

(1) 说明:用于实现常见的错误处理策略,没有之前和之后事件,处理 Razor 页面或控制器创建、模型绑定、操作过滤器或操作方法中发生的未经处理的异常。 但无法捕获资源过滤器、结果过滤器或 MVC 结果执行中发生的异常 。

(2) 实现:继承Attribute类,实现IExceptionFilter接口,重写OnException方法。 或者直接继承ExceptionFilterAttribute类,观察源码可知,该类继承了Attribute类,而且还实现IExceptionFilter接口。(异步的话实现 IAsyncExceptionFilter接口,重写OnExceptionAsync方法)

(3) 用途:全局捕获异常,进行相关处理。

 

二、执行顺序

 1. 过滤器执行顺序

 异常过滤器不参与测试,测试剩余四个过滤器的执行顺序,将四个过滤器在下面Index2方法上,经断点测试执行顺序如下:

 OnAuthorization→OnResourceExecuting→创建控制器→OnActionExecuting→执行action业务→OnActionExecuted→OnResultExecuting→页面渲染加载→

OnResultExecuted→OnResourceExecuted

 

三、使用方法

一、授权过滤器,用于判断方法是否运行匿名方法

 

 

2、行为过滤器实现权限判断

 

 

3、结果过滤器

  public class MyResultFilterAttribute : ResultFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext context)
        {
      
            base.OnResultExecuting(context);
        }
        public override void OnResultExecuted(ResultExecutedContext context)
        {
            base.OnResultExecuted(context);
        }
    }

 

 

4、异常过滤器

 public class ExceptionHandler:ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            base.OnException(context);
            if (!context.ExceptionHandled)//如果异常没有被处理过
            {
                string controllerName = (string)context.RouteData.Values["controller"];
                string actionName = (string)context.RouteData.Values["action"];
                //string msgTemplate =string.Format( "在执行controller[{0}的{1}]方法时产生异常",controllerName,actionName);//写入日志


;
            }
        }

    }

 

posted on 2022-03-13 20:57  topguntopgun  阅读(3763)  评论(0编辑  收藏  举报

导航