• 第五节:WebApi的三大过滤器


    一. 基本说明 

     1. 简介:

      WebApi下的过滤器和MVC下的过滤器有一些区别,首先我们要注意的是通常建WebApi项目时,会自动把MVC的程序集也引入进来,所以我们在使用WebApi下的过滤器的时候,要引入“ System.Web.Http”这个程序集,而不是MVC的“System.Web.MVC”。

    PS:关于WebApi下的过滤器在的作用位置和使用方法以及执行顺序,均和MVC下的过滤器相似,详见:https://www.cnblogs.com/yaopengfei/p/7910763.html

    2. 与MVC过滤器的区别

      由于WebApi只关注于方法,所以WebApi下没有结果过滤器, 详细分析: ActionFilterAttribute这个类并没有继承IResultFilter这个接口,只继承了IActionFilter这个接口,重写了OnActionExecuted和OnActionExecuting两个方法(包括对应的异步方法),并没有重写:OnResultExecuted和OnResultExecuting两个方法。

    3. 过滤器的重写方法的执行顺序:

      OnAuthorization→OnActionExecuting-> Action方法执行 ->OnActionExecuted

    二. 三大过滤器

    1. 授权过滤器

      继承AuthorizeAttribute类,重写OnAuthorization方法,eg:MyAuthorize类.

     1  public class MyAuthorize : AuthorizeAttribute
     2     {
     3         public override void OnAuthorization(HttpActionContext actionContext)
     4         {
     5 
     6             //1.如果保留如下代码,则会运行.net framework定义好的身份验证,如果希望自定义身份验证,则删除如下代码
     7             // base.OnAuthorization(actionContext);
     8 
     9             //2.获取控制器作用的Controller和action的名字
    10             string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
    11             string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
    12             HttpContext.Current.Response.Write("身份验证过滤器作用于" + controllerName + "控制器下的" + actionName + "方法");
    13         }
    14     }

    2. 行为过滤器

      继承ActionFilterAttribute,重写OnActionExecuting和OnActionExecuted方法,eg:MyAction类

     1  public class MyAction: ActionFilterAttribute
     2     {
     3         /// <summary>
     4         /// 在Action方法运行之前调用
     5         /// </summary>
     6         /// <param name="actionContext"></param>
     7         public override void OnActionExecuting(HttpActionContext actionContext)
     8         {
     9 
    10             //1.如果保留如下代码,则会运行.net framework定义好的行为验证,如果希望自定义行为验证,则删除如下代码
    11             // base.OnActionExecuting(actionContext);
    12 
    13             //2.获取控制器作用的Controller和action的名字
    14             string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
    15             string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
    16             HttpContext.Current.Response.Write("行为过滤器OnActionExecuting作用于" + controllerName + "控制器下的" + actionName + "方法运行之前");
    17         }
    18 
    19         /// <summary>
    20         /// 在Action方法运行之后调用
    21         /// </summary>
    22         /// <param name="actionExecutedContext"></param>
    23         public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    24         {
    25             base.OnActionExecuted(actionExecutedContext);
    26 
    27             //1.如果保留如下代码,则会运行.net framework定义好的行为验证,如果希望自定义行为验证,则删除如下代码
    28             // base.OnActionExecuted(actionExecutedContext);
    29 
    30             //2.获取控制器作用的Controller和action的名字
    31             string controllerName = actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName.ToLower();
    32             string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName.ToLower();
    33             HttpContext.Current.Response.Write("行为过滤器OnActionExecuted作用于" + controllerName + "控制器下的" + actionName + "方法运行之后");
    34         }    
    35     }

      测试:用PostMan请求下面的CheckLogin方法,可以验证上面的执行顺序:OnAuthorization→OnActionExecuting-> Action方法执行 ->OnActionExecuted

    3.异常个过滤器

      实现IExceptionFilter接口,继承FilterAttribute类(能以特性的形式作用),eg:MyException类.

     1 /// <summary>
     2     /// 异常过滤器
     3     /// </summary>
     4     public class MyException : FilterAttribute,IExceptionFilter
     5     {
     6         //public bool AllowMultiple => throw new NotImplementedException();
     7 
     8         public async Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
     9         {
    10             //throw new NotImplementedException();
    11 
    12             //1.获取异常信息
    13             string errorMsg = actionExecutedContext.Exception.ToString();
    14       
    15             //2.对获取的异常信息进行处理
    16             using (StreamWriter writer = File.AppendText("d:/err.txt"))
    17             {
    18                 await writer.WriteLineAsync(errorMsg);
    19             }
    20 
    21         }
    22     }

      测试: 用PostMan请求下面的CheckLogin2方法,手动制造错误,会进入异常过滤器中,获取错误,进行相应的处理.

     

      

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/10357182.html
Copyright © 2020-2023  润新知