zoukankan      html  css  js  c++  java
  • ASP.NET Web API 2 过滤器

    Ø  前言

    我们知道 ASP.NET Web API 过滤器,也是属于消息处理机制中的一部分。正因如此,我们经常使用它来完成对请求的授权验证、参数验证,以及请求的 Log 记录,程序异常捕获等。

     

    1.   常用的四大过滤器

    Ø  ASP.NET Web API 2 中的所有过滤器位于 System.Web.Http.dll 中的 System.Web.Http.Filters 命名空间中,继承关系如下:

    clip_image001[1]

    1.   AuthenticationFilter:身份证验证过滤器,必须实现 IAuthenticationFilter 接口。微软推出了一套身份验证组件(ASP.NET Identity)就是采用了该过滤实现,该组件位于 System.Web.Http.Owin.dll 程序集,主要使用 System.Web.Http.HostAuthenticationFilter 过滤器,可参考:https://www.cnblogs.com/yidianfeng/p/7765984.html

    2.   AuthorizationFilter:授权过滤器,必须继承于 AuthorizationFilterAttribute 类,或实现 IAuthorizationFilter 接口。

    3.   ActionFilter:动作过滤器,必须继承于 ActionFilterAttribute 类,或者实现 IActionFilter 接口。

    4.   ExceptionFilter:异常过滤器,必须继承于 ExceptionFilterAttribute 类,或者实现 IExceptionFilter 接口。

     

    Ø  注意:因为 Web API MVC 中很多过滤器名称都相同,但过滤器位于的程序集和命名空间是不同的。MVC 中的过滤器位于 System.Web.Mvc.dll 中的 System.Web.Mvc 命名空间,这不能搞混了!

     

    Ø  首先,我们来看下过滤器的执行顺序

    clip_image003[1]

    1)   图中描述了4种过滤器的执行顺序,而每个执行过程中发生异常,都会被异常过滤器捕获。

    2)   每当一个请求进来时,可能存在的三种响应结果:401,无访问权限,500,请求发生异常,200,请求成功。

     

    Ø  过滤器的用法

    1)   创建过滤器

    1.   AuthenticationFilter(身份验证过滤器)

    它是最先执行的过滤器,一般用于对访问者的身份认证等。

    /// <summary>

    /// 身份验证过滤器特性。

    /// </summary>

    public class CustomAuthenticationFilterAttribute

        : System.Web.Http.Filters.FilterAttribute, System.Web.Http.Filters.IAuthenticationFilter

    {

        public System.Threading.Tasks.Task AuthenticateAsync(System.Web.Http.Filters.HttpAuthenticationContext context, System.Threading.CancellationToken cancellationToken)

        {

            //这里完成身份验证...

            return Task.FromResult(0);

        }

     

        public System.Threading.Tasks.Task ChallengeAsync(System.Web.Http.Filters.HttpAuthenticationChallengeContext context, System.Threading.CancellationToken cancellationToken)

        {

            return Task.FromResult(0);

        }

    }

     

    2.   AuthorizationFilter(授权过滤器)

    授权过滤器通常用于控制接口访问权限,只有当访问权限满足时,才允许访问程序中的接口。用于提高程序的安全性,防止程序被恶意篡改。通常可以使用 Basic 认证、签名认证等。

    /// <summary>

    /// 授权过滤器特性。

    /// </summary>

    public class CustomAuthorizationFilterAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute

    {

        /// <summary>

        /// 在过程请求授权时调用。

        /// </summary>

        /// <param name="actionContext">操作上下文,它封装有关使用 System.Web.Http.Filters.AuthorizationFilterAttribute 的信息。</param>

        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            //这里完成请求权限的控制...

        }

    }

     

    3.   ActionFilter(动作过滤器)

    动作过滤器中有两个方法,一个是 OnActionExecuting(),在调用 Action() 方法之前执行,另一个是 OnActionExecuted(),在调用 Action() 方法之后执行。

    /// <summary>

    /// 动作过滤器特性。

    /// </summary>

    public class CustomActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute

    {

        /// <summary>

        /// 在调用操作方法之前发生。

        /// </summary>

        /// <param name="actionContext">操作上下文。</param>

        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            //这里完成请求参数的验证...

        }

     

        /// <summary>

        /// 在调用操作方法之后发生。

        /// </summary>

        /// <param name="actionExecutedContext">操作执行的上下文。</param>

        public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)

        {

            //这里完成请求日志的记录...

        }

    }

    1.   OnActionExecuting () 方法

    通常可以在该方法中,完成对接口参数的效验。

    2.   OnActionExecuted () 方法

    一般可以用于记录调用接口的 log

     

    4.   ExceptionFilter(异常过滤器)

    异常过滤器中一个 OnException() 方法,当程序发生异常时将被执行。通常可以用于监控程序异常,记录异常日志。

    /// <summary>

    /// 自定义异常过滤器特性。

    /// </summary>

    public class CustomExceptionFilterAttribute : System.Web.Http.Filters.ExceptionFilterAttribute

    {

        /// <summary>

        /// 异常过滤器特性。

        /// </summary>

        /// <param name="actionExecutedContext">操作的上下文。</param>

        public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)

        {

            //当程序发生异常时执行的代码...

            actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(

                System.Net.HttpStatusCode.InternalServerError,

                string.Format("异常:【{0}】已被捕获", actionExecutedContext.Exception.Message));

        }

    }

     

    2)   注册过滤器

    1.   注册全局过滤器

    WebApiConfig 类的 Register() 方法中注册,例如:

    config.Filters.Add(new WebAPI2.Filter.Filters.CustomExceptionFilterAttribute());

    config.Filters.Add(new WebAPI2.Filter.Filters.CustomActionFilterAttribute());           

    config.Filters.Add(new WebAPI2.Filter.Filters.CustomAuthorizationFilterAttribute());

    config.Filters.Add(new WebAPI2.Filter.Filters.CustomAuthenticationFilterAttribute());  

    通常异常过滤、动作过滤器都是定义为全局过滤器。

     

    2.   定义 Controller Action 过滤器

    我们需要为指定的 Controller Action 单独设置过滤器时,也可以这样定义:

    [WebAPI2.Filter.Filters.CustomActionFilter]

    [WebAPI2.Filter.Filters.CustomAuthorizationFilter]

    [RoutePrefix("api/values")]

    public class ValuesController : ApiController

    { }

    或者

    [WebAPI2.Filter.Filters.CustomAuthorizationFilter]

    public HttpResponseMessage Get(HttpRequestMessage request, int id)

    {

    return request.CreateResponse<string>(HttpStatusCode.OK, "Get Action 方法执行,id值为:" + id);

    }

     

    Ø  注意:过滤器不能在 FilterConfig 中的 RegisterGlobalFilters() 注册,因为这里是注册 MVC 过滤器的。

  • 相关阅读:
    Redis网络连接库剖析
    如何下载和安装pywin32
    Python游戏开发入门:pygame事件处理机制
    python常见错误
    波特率与比特率
    __gcd最大公约数
    动态规划算法之矩阵连乘问题
    二分插入排序+二分搜索
    office 总结
    javaWeb总结
  • 原文地址:https://www.cnblogs.com/abeam/p/8688838.html
Copyright © 2011-2022 走看看