Web API包含在操作方法执行之前或之后添加额外的逻辑的过滤器。过滤器可用于提供横切特性,比如日志记录、异常处理、性能测量、身份验证和授权等等。

过滤器可以应用于Web API控制器或一个或多个操作方法上的属性。每个过滤器是必须实现System.Web.Http.Filters命名空间中的IFilter接口的类。然而,System.Web.Http.Filters命名空间还包括其他其他可用于创建特定过滤器的接口和类。

下表列出了可用于创建Web API过滤器的重要的接口和类。

过滤器类型 接口 描述
简单的过滤 IFilter - 定义一个过滤器中使用的方法
Action方法过滤器 IActionFilter ActionFilterAttribute 用于添加额外的逻辑操作方法执行之前或之后。
身份验证过滤器 IAuthenticationFilter - 用于迫使用户或客户执行操作方法之前验证。
授权过滤器 IAuthorizationFilter AuthorizationFilterAttribute 用来限制特定的用户或组访问操作方法。
异常过滤器 IExceptionFilter ExceptionFilterAttribute 用于处理Web API所有未处理的异常。
覆盖过滤器 IOverrideFilter - 用于定制其他过滤器的行为。

正如你所看到的,上面的表列举了一些过滤器器类型的类以及接口。接口包含了您的自定义属性类中必须实现的方法,而过滤器类则已经实现了这些方法。这些方法便于Web API可以覆盖添加额外的逻辑。例如,ActionFilterAttribute类包括可以覆盖的方法。我们只需要覆盖想要覆盖的方法,但是如果你使用IActionFilter属性,你必须实现的所有方法。

访问MSDN了解System.Web.Http.Filters命名空间下的所有可用的类和接口。

让我们创建一个用来记录日志的LogAttribute类,来展示Action过滤器。

首先,创建一个继承自ActionFilterAttribute类的LogAttribute类,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class LogAttribute : ActionFilterAttribute 
 {
    public LogAttribute()
    {
    }
        
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        Trace.WriteLine(string.Format("Action Method {0} executing at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
    }
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        Trace.WriteLine(string.Format("Action Method {0} executed at {1}", actionExecutedContext.ActionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
    }
}

在上面的例子中,LogAttribute来源于ActionFilterAttribute类并覆盖OnActionExecuting和OnActionExecuted方法用来记录日志到跟踪侦听器。(你也可以使用你自己的日志类来记录日志到文本文件或其他介质。)

创建LogAttribute类的另一种方法是通过实现IActionFilter接口并派生属性类,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class LogAttribute : Attribute, IActionFilter
{
    public LogAttribute()
    {
    }
    public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    {
        Trace.WriteLine(string.Format("Action Method {0} executing at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
        var result = continuation();
        result.Wait();
             
        Trace.WriteLine(string.Format("Action Method {0} executed at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
        return result;
    }
    public bool AllowMultiple
    {
        get return true; }
    }
}

在上面的例子中,继承于属性类使其是一个属性,实现IActionFilter使LogAttribute类是一个Action过滤器。

现在,您可以在控制器或操作方法中应用[Log]属性如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
[Log]
public class StudentController : ApiController
{
    public StudentController()
    {
             
    }
    public Student Get()
    {
        //provide implementation  
    }
}

现在,它将记录所有StudentController的请求。因此您可以用这种方法对横切关注点创建过滤器。

出处:http://www.yuanjiaocheng.net/webapi/webapi-filters.html#Web API过滤器

Web API过滤器的更多相关文章

  1. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  2. ASP.NET Web API 过滤器创建、执行过程(一)

    ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...

  3. MVC和Web API 过滤器Filter [转]

    ASP.NET MVC 支持以下类型的操作筛选器: ·        授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性) ...

  4. MVC和Web API 过滤器Filter

    MVC和Web API Filter(过滤器) ASP.NET MVC 支持以下类型的操作筛选器: ·        授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是 ...

  5. web api 过滤器

    /// <summary> /// 渠道过滤器 /// </summary> [AttributeUsage(AttributeTargets.Class | Attribut ...

  6. ASP.NET Web API 2 过滤器

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

  7. 利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理

    在我们开发Web API应用的时候,我们可以借鉴ABP框架的过滤器Filter和特性Attribute的应用,实现对Web API返回结果的封装和统一异常处理,本篇随笔介绍利用AuthorizeAtt ...

  8. ASP.NET Web API 2 之参数验证

    Ø  前言 目前 C# 比较流行使用 ASP.NET Web API 来承载 Web 接口,提供与客户端之间的数据交互,现在的版本已经是 2.0 了.既然是接口就少不了对输入参数的验证,所以本文主要探 ...

  9. Web APi之过滤器执行过程原理解析【二】(十一)

    前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授 ...

随机推荐

  1. utf8 与 utf-8区别

    在使用中常常遇到 utf-8 和 utf8,现在终于弄明白他们的使用不同之处了,现在来和大家分享一下,下面我们看一下 utf8 和 UTF-8 有什么区别. "UTF-8" 是标准 ...

  2. [vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick

    思路: 1. 组件的好处,重用性 2. 组件对的slot用法 3. 子如何调用父的数据 4. 子如何触发父的方法执行 5. 父如何触发子的方法执行 6. 如何创建组件和销毁自建--如何缓存避免每次切换 ...

  3. [py][mx]django通过邮箱找回密码

    忘记密码处理流程 注意: 这个文章里的找回密码页面截取有问题. 找回密码页应该是让输入邮箱 直接上代码 class ActiveView(View): # 主要功能是修改user_profile里的i ...

  4. for与while的特点及其if在什么情况下使用情况

    for和while的特点: 什么时候使用循环结构呢? 1:当对某些代码执行很多次时,使用循环结构完成. 2:当对一个条件进行一次判断时,可以使用if语句. 3:当对一个条件进行多次判断时,可以使用wh ...

  5. 函数及while实例

    输入1,输出:if 输入2,输出:elif 输入其他数值,输出:else 输入非数字,输出:except def greeting3(name3, lang3=1): if lang3 == 1: r ...

  6. php深入学习

    关于PHP程序员解决问题的能力 http://rango.swoole.com/archives/340 深入理解PHP内核 by xuhong大牛 http://www.php-internals. ...

  7. 54. Spiral Matrix(剑指offer--19)

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  8. yii2 restful api——app接口编程实例

    <?php namespace common\components; use common\models\Cart; use common\models\User; use Yii; use y ...

  9. ac1008

    这题说的是 给了n个点在圆 上 然后 i连 i+2 从i+2 开始连 i+4  然后 这样一直到某个点 已经被连过为止   如果还有的没有被连过 就从那个点开始 连 按照上面的规则 当 N大于6 的时 ...

  10. 查看Tensorflow版本

    python -c 'import tensorflow as tf; print(tf.__version__)' # for Python 2 python3 -c 'import tensorf ...