ASP.NET Web API 2 过滤器
Ø 前言
我们知道 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 过滤器相关推荐
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session
原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NE ...
- 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 ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- ASP.net Web API综合示例
目录 概述 功能介绍 程序结构 服务器端介绍 客户端介绍 "契约" Web API设计规则 并行写入冲突与时间戳 身份验证详解 Web API验证规则 客户端MVVM简介 Web. ...
- Asp.Net Web API(四)
HttpResponseException-----HTTP响应异常 如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误 ...
- 在ASP.NET Web API中返回错误的最佳实践
本文翻译自:Best practice to return errors in ASP.NET Web API I have concerns on the way that we returns e ...
- 【Web API系列教程】1.3 — 实战:用ASP.NET Web API和Angular.js创建单页面应用程序(上)
前言 在传统的web应用程序中,客户端(浏览器)通过请求页面来启动与服务器的通信.然后服务器处理该请求,并发送HTML页面到客户端.在随后页面上的操作中--例如,用户导航到一个链接或提交一个包含数据的 ...
- 《ASP.NET Web API 2框架揭秘》
<ASP.NET Web API 2框架揭秘> 基本信息 作者: 蒋金楠 出版社:电子工业出版社 ISBN:9787121235368 上架时间:2014-7-5 出版日期:2014 年7 ...
最新文章
- html5 实现手机摇一摇功能(C)
- 从底层理解Python的执行
- 在SAP CRM呼叫中心的搜索结果点击Edit按钮后的处理逻辑
- 简单粗暴的肢体语言解读攻略 | 今日最佳
- GC算法-标记压缩算法
- 人脸识别python face_recognize_python2.7使用face_recognition做人脸识别
- 基于Rainbond开发Python云原生应用
- python入门教程(非常详细)-菜鸟学Python入门教程大盘点|7个多月的心血总结
- js打印线程id_理解Python多线程:通过易懂的小例子展开第一篇
- 数字滤波器原理及应用 借助matlab,数字滤波器原理及应用(借助MATLAB)
- 自定义函数求两个整数的绝对差值及排序
- C++后台开发面试常考
- 台式计算机音频插口,解决台式机电脑机箱前置音频插口(接口)不能使用一例.
- chrome、Firefox、IE浏览器和驱动下载地址
- Hadoop HFDS 的 Shell 操作
- bboss ioc快速入门教程
- Android9怎样安装xposed,EdXposed 在android 9 上的安装和使用
- 谷歌机器学习主管:10年自学数据科学的3点心得体会
- Android D/dalvikvm : GC_FOR_ALLOC freed
- antv x6基类cell第五讲-文本节点可编辑
热门文章
- C# 中socket根据Receive判断 TcpClient关闭连接的处理
- asp.net 应用数据缓存 -- Cache对象使用
- 【python 5】正则表达式
- chi-squared检验_每位数据科学家都必须具备Chi-S方检验统计量:客户流失中的案例研究
- 代码单元测试:gtest
- 17家银行工资单:招行人均45万夺冠
- MDK编译生成bin文件
- 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...
- python在统计专业的应用_Python统计学一数据的概括性度量详解
- mysql c api 封装_封装MySQL C API 基本操作