Ø  前言

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

1.   常用的四大过滤器

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

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 命名空间,这不能搞混了!

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

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 过滤器的。

转载于:https://www.cnblogs.com/abeam/p/8688838.html

ASP.NET Web API 2 过滤器相关推荐

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

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

  2. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NE ...

  3. Asp.Net Web API 2第七课——Web API异常处理

    Asp.Net Web API 2第七课--Web API异常处理 原文:Asp.Net Web API 2第七课--Web API异常处理 前言 阅读本文之前,您也可以到Asp.Net Web AP ...

  4. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  5. ASP.net Web API综合示例

    目录 概述 功能介绍 程序结构 服务器端介绍 客户端介绍 "契约" Web API设计规则 并行写入冲突与时间戳 身份验证详解 Web API验证规则 客户端MVVM简介 Web. ...

  6. Asp.Net Web API(四)

    HttpResponseException-----HTTP响应异常 如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误 ...

  7. 在ASP.NET Web API中返回错误的最佳实践

    本文翻译自:Best practice to return errors in ASP.NET Web API I have concerns on the way that we returns e ...

  8. 【Web API系列教程】1.3 — 实战:用ASP.NET Web API和Angular.js创建单页面应用程序(上)

    前言 在传统的web应用程序中,客户端(浏览器)通过请求页面来启动与服务器的通信.然后服务器处理该请求,并发送HTML页面到客户端.在随后页面上的操作中--例如,用户导航到一个链接或提交一个包含数据的 ...

  9. 《ASP.NET Web API 2框架揭秘》

    <ASP.NET Web API 2框架揭秘> 基本信息 作者: 蒋金楠 出版社:电子工业出版社 ISBN:9787121235368 上架时间:2014-7-5 出版日期:2014 年7 ...

最新文章

  1. html5 实现手机摇一摇功能(C)
  2. 从底层理解Python的执行
  3. 在SAP CRM呼叫中心的搜索结果点击Edit按钮后的处理逻辑
  4. 简单粗暴的肢体语言解读攻略 | 今日最佳
  5. GC算法-标记压缩算法
  6. 人脸识别python face_recognize_python2.7使用face_recognition做人脸识别
  7. 基于Rainbond开发Python云原生应用
  8. python入门教程(非常详细)-菜鸟学Python入门教程大盘点|7个多月的心血总结
  9. js打印线程id_理解Python多线程:通过易懂的小例子展开第一篇
  10. 数字滤波器原理及应用 借助matlab,数字滤波器原理及应用(借助MATLAB)
  11. 自定义函数求两个整数的绝对差值及排序
  12. C++后台开发面试常考
  13. 台式计算机音频插口,解决台式机电脑机箱前置音频插口(接口)不能使用一例.
  14. chrome、Firefox、IE浏览器和驱动下载地址
  15. Hadoop HFDS 的 Shell 操作
  16. bboss ioc快速入门教程
  17. Android9怎样安装xposed,EdXposed 在android 9 上的安装和使用
  18. 谷歌机器学习主管:10年自学数据科学的3点心得体会
  19. Android D/dalvikvm : GC_FOR_ALLOC freed
  20. antv x6基类cell第五讲-文本节点可编辑

热门文章

  1. C# 中socket根据Receive判断 TcpClient关闭连接的处理
  2. asp.net 应用数据缓存 -- Cache对象使用
  3. 【python 5】正则表达式
  4. chi-squared检验_每位数据科学家都必须具备Chi-S方检验统计量:客户流失中的案例研究
  5. 代码单元测试:gtest
  6. 17家银行工资单:招行人均45万夺冠
  7. MDK编译生成bin文件
  8. 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...
  9. python在统计专业的应用_Python统计学一数据的概括性度量详解
  10. mysql c api 封装_封装MySQL C API 基本操作