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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为选择合适的ERP供应商,是否该发布需求建议书(RFP)?

全球有成百上千家企业资源规划 (ERP) 解决方案供应商。在开展挑选 ERP 供应商的项目时&#xff0c;不可能与所有这些供应商都进行接触。不断缩小这一领域供应商的范围&#xff0c;直到最终敲定最适合的入围名单&#xff08;通常被称为“最终候选人名单”&#xff09;是项目成功…

java stream 原理

java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字&#xff0c;然后从中选出最长的一个&#xff0c;并输出其长度 1. 最直白的实现 缺点 迭代次数过多频繁产生中间结果&#xff0c;性能无法接受2. 平常写法 int …

Java常量池理解与总结

2019独角兽企业重金招聘Python工程师标准>>> 一.相关概念 什么是常量用final修饰的成员变量表示常量&#xff0c;值一旦给定就无法改变&#xff01;final修饰的变量有三种&#xff1a;静态变量、实例变量和局部变量&#xff0c;分别表示三种类型的常量。Class文件中…

转载:https://blog.csdn.net/dcrmg/article/details/52939318

张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析&#xff08;附标定程序和棋盘图&#xff09;使用Opencv实现张正友法相机标定之前&#xff0c;有几个问题事先要确认一下&#xff0c;那就是相机为什么需要标定&#xff0c;标定需要的输…

Redis学习笔记--Redis数据过期策略详解==转

本文对Redis的过期机制简单的讲解一下  讲解之前我们先抛出一个问题&#xff0c;我们知道很多时候服务器经常会用到redis作为缓存&#xff0c;有很多数据都是临时缓存一下&#xff0c;可能用过之后很久都不会再用到了&#xff08;比如暂存session&#xff0c;又或者只存放日行…

会员连锁配置以及金额走向

PS&#xff1a;所有电子支付方式的资金走向都是同样的&#xff0c;配置的是什么支付方式就走什么支付方式;下面以支付宝为例说明 一、连锁非总机模式 资金走向&#xff1a; 支付宝&#xff1a;收到的钱在主账号配置的支付宝&#xff0c;会员卡的金额在主账号 微信&#xff1a;收…

C# 多线程及同步简介示例

60年代&#xff0c;在OS中能拥有资源和独立运行的基本单位是进程&#xff0c;然而随着计算机技术的发展&#xff0c;进程出现了很多弊端&#xff0c;一是由于进程是资源拥有者&#xff0c;创建、撤消与切换存在较大的时空开销&#xff0c;因此需要引入轻型进程&#xff1b;二是…

Spring Framework 5.1.6、5.0.13 与 4.3.23 发布

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; Spring Framework 5.1.6、5.0.13 与 4.3.23 发布了。 v5.1.6 包含 49 个 bug 修复和功能改进&#xff1b;v5.0.13 是 5.0.x 系列的最后一个版本&#xff0c;包含了 25 个 bug 修复和功能改进&am…

单目视觉标定:世界坐标系、相机坐标系、图像坐标系、像素坐标系——简单粗暴,粗暴

转&#xff1a;https://blog.csdn.net/chentravelling/article/details/53558096 1.正文 图像处理、立体视觉等等方向常常涉及到四个坐标系&#xff1a;世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图&#xff1a; 构建世界坐标系只是为了更好的描述相机的位置在哪…

VSFTP的使用

一、基本安装 1.安装服务 yum -y install vsftpd //centos Redhat apt-get install vsftpd //debian ubuntu 2.开启服务 service vsftpd status //查看状态&#xff0c;默认是关闭的 service vsftpd start 3.开机随操作系统启动 chkconfig vsftpd on4.添加账号 useradd -d /…

OC Swift混编-Swift.h File not found

https://www.jianshu.com/p/f860fe1718ca 2016.09.13 11:53* 字数 266 阅读 1935评论 1喜欢 1今天碰到个神坑,本人项目是OC项目,最近开始使用Swift开始替代.但是,在替代的已开始就出现问题了:新建swift文件,然后提示创建bridging-Hearder文件,然后swift可以使用OC代码了.这些都…

视觉标定,再来一波!!更简单粗暴!!!!!!

继续&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 一、四个坐标系简介和转换 相机模型为以后一切标定算法的关键&#xff0c;只有这边有相当透彻的理解&#xff0c;对以后的标定算法才能有更好的理解。本人研究了好长时间&#xff0c;几乎每天…

深入浅出NIO之Selector实现原理

2019独角兽企业重金招聘Python工程师标准>>> 前言 Java NIO 由以下几个核心部分组成&#xff1a; 1、Buffer 2、Channel 3、Selector Buffer和Channel在深入浅出NIO之Channel、Buffer一文中已经介绍过&#xff0c;本文主要讲解NIO的Selector实现原理。 之前进行sock…

介绍一下画图小能手matplotlib。

我们在做完数据分析的时候需要把分析出来的结果&#xff0c;做一个图形化的形象表达&#xff0c;这里我们就需要用到画图小能手matplotlib&#xff0c;下面就演示一下常用的条形图和折线图 散点图 散点图的做大的作用是研究两个变量的相关性&#xff08;正相关&#xff0c;负相…

立体视觉标定源代码C++,简单粗暴!粗暴·······

疑点解答&#xff1a; 摄像机矩阵由内参矩阵和外参矩阵组成&#xff0c;对摄像机矩阵进行QR分解可以得到内参矩阵和外参矩阵。 内参包括焦距、主点、倾斜系数、畸变系数 &#xff08;1&#xff09; 其中&#xff0c;fx&#xff0c;fy为焦距&#xff0c;一般情况下&#xff…

MongoDB负载信息一目了然 阿里云HDM重磅发布MongoDB监控和诊断功

2019独角兽企业重金招聘Python工程师标准>>> 混合云数据库管理&#xff08;HDM&#xff09;的统一监控、告警、诊断功能新增了对MongoDB的支持。 通过直观的方式将MongoDB多个维度的负载信息统一整合&#xff0c;不仅可以清晰的查看实时负载信息&#xff0c;也可以方…

在iview的Table中添加Select(render)

首先对Render进行分析&#xff0c;在iview官方的文档中&#xff0c;找到了table插入Button的例子&#xff1a; [javascript] view plaincopy { title: Action, key: action, width: 150, align: center, render: (h, params) > { return h(div, [ h(Butt…

工业机械人运动学正逆解,简单粗暴!!!!!!

ur机械臂是六自由度机械臂&#xff0c;由D-H参数法确定它的运动学模型&#xff0c;连杆坐标系的建立如上图所示。 转动关节θi是关节变量&#xff0c;连杆偏移di是常数。 关节编号 α&#xff08;绕x轴&#xff09; a&#xff08;沿x轴&#xff09; θ&#xff08;绕z轴&am…

python opencv立体测距 立体匹配BM算法

立体标定应用标定数据转换成深度图标定 在开始之前&#xff0c;需要准备的当然是两个摄相头&#xff0c;根据你的需求将两个摄像头进行相对位置的固定&#xff0c;我是按平行来进行固定的&#xff08;如果为了追求两个双目图像更高的生命度&#xff0c;也可以将其按一定钝角固…

Vue基础学习(一)------内部指令

一.v-if v-else v-show 指令 1.v-if v-if:是vue 的一个内部指令&#xff0c;指令用在我们的html中,用来判断是否加载html的DOM 现在举个栗子&#xff0c;判断用户的登录操作&#xff0c;用isLogin作为一个判断字段&#xff0c;登录成功&#xff0c;就显示用户的名称 代码&…