Web API过滤器
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过滤器的更多相关文章
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- ASP.NET Web API 过滤器创建、执行过程(一)
ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...
- MVC和Web API 过滤器Filter [转]
ASP.NET MVC 支持以下类型的操作筛选器: · 授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性) ...
- MVC和Web API 过滤器Filter
MVC和Web API Filter(过滤器) ASP.NET MVC 支持以下类型的操作筛选器: · 授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是 ...
- web api 过滤器
/// <summary> /// 渠道过滤器 /// </summary> [AttributeUsage(AttributeTargets.Class | Attribut ...
- ASP.NET Web API 2 过滤器
Ø 前言 我们知道 ASP.NET Web API 过滤器,也是属于消息处理机制中的一部分.正因如此,我们经常使用它来完成对请求的授权验证.参数验证,以及请求的 Log 记录,程序异常捕获等. 1. ...
- 利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理
在我们开发Web API应用的时候,我们可以借鉴ABP框架的过滤器Filter和特性Attribute的应用,实现对Web API返回结果的封装和统一异常处理,本篇随笔介绍利用AuthorizeAtt ...
- ASP.NET Web API 2 之参数验证
Ø 前言 目前 C# 比较流行使用 ASP.NET Web API 来承载 Web 接口,提供与客户端之间的数据交互,现在的版本已经是 2.0 了.既然是接口就少不了对输入参数的验证,所以本文主要探 ...
- Web APi之过滤器执行过程原理解析【二】(十一)
前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授 ...
随机推荐
- vue-preview使用
1.安装 npm i vue-preview -S2.如果使用vue-cli生成的项目,需要修改webpack.base.conf.js文件中的loaders,添加一个loader{ test:/vu ...
- 非受限联合体 - 现代C++新特性总结
非受限联合体 非受限联合体:C++98中并不是所有数据类型都能够成为union的数据成员,不允许联合体拥有非POD(Plain Old Data).静态或引用类型的成员. C++11中取消了联合体对于 ...
- python2与python3之间的主要区别
python2与python3之间的主要区别 print py2:print语句,语句就意味着可以直接跟要打印的东西,如果后面接的是一个元组对象,直接打印 py3:print函数,函数就以为这必须要加 ...
- centos7最小安装初始化脚本
#!/bin/bash #zhangsen #lovexlzs@qq.com if [[ "$(whoami)" != "root" ]]; then exit ...
- Qt元对象系统简介
在Qt中提供了c++的扩展,提供了一种元对象系统的机制,(meta-object-system)的机制.其中包含了信号与槽的内部机制,能够访问到QObject子类的元对象信息的功能. Q_OBJECT ...
- Linux系统——JumpServer跳板机的搭建和部署
公网源部署jumpserver跳板机 建立阿里云公网源yum仓库(服务端)[root@localhost ~]# lsanaconda-ks.cfg install.log.syslog jumpse ...
- EditPlus 中文版停止更新
经过一段时间的考虑,我决定了终止 EditPlus 的中文版翻译工作. 感谢各位网友在这么长时间内对本汉化项目的关注.
- M2C的概念
M2C即Manufacturers to Consumer(生产厂家对消费者),生产厂家(Manufacturers)直接对消费者(Consumers)提供自己生产的产品或服务的一种商业模式,特点是流 ...
- 使用 JsPlumb 绘制拓扑图的通用方法
摘要: 实现 JsPlumb 绘制拓扑图的通用方法. 只要服务端返回一个符合指定格式的数据结构,就可以绘制相应的拓扑图. 难度: 中级 示例工程见: http://download.csdn.net ...
- 由浅入深之Tensorflow(3)----数据读取之TFRecords
转载自http://blog.csdn.net/u012759136/article/details/52232266 原文作者github地址 概述 关于Tensorflow读取数据,官网给出了三种 ...