ASP.NET MVC5学习笔记之Filter基本介绍
Filter是ASP.NET MVC框架提供的基于AOP(面向方面)设计,提供在Action执行前后做一些非业务逻辑通用处理,如用户验证,缓存等。现在来看看Filter相关的一些类型信息。
一.基本类型
1. Filter类型,描述筛选器信息的元数据类型,具体定义如下:
public class Filter
{
// 表示一个用于指定筛选器的默认顺序的常数。
public const int DefaultOrder = -; public Filter(object instance, FilterScope scope, int? order); public object Instance { get; protected set; } public int Order { get; protected set; } public FilterScope Scope { get; protected set; }
}
通过代码了解可以了解到它封装了筛选器的实例(Instance属性),调用的顺序(Order属性)和应用的范围(Scope属性)。Order值越小,调用优先级越高。Scope通过FilterScope枚举定义,它的定义如下:
public enum FilterScope
{ First = ,
Global = ,
Controller = ,
Action = ,
Last = ,
}
当两个同类型的Filter的Order相同时,则Scope来决定调用顺序,和Order一样,值越小,调用优先级越高。Scope通常是在FilterProvier中指定的。
2. FilterAttribute类型
对于Controller和Action Leve的Filter通常是以属性(Attribute)的应用,ASP.NET MVC提供了一个Filter属性基类FilterAttribute,定义如下:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public abstract class FilterAttribute : Attribute, IMvcFilter
{ protected FilterAttribute();
public bool AllowMultiple { get; }
public int Order { get; set; }
}
属性AllowMultiple和Order是接口IMvcFilter的成员,定义如下:
public interface IMvcFilter
{
bool AllowMultiple { get; }
int Order { get; }
}
AllowMultiple表示是否可指定筛选器特性的多个实例, Order属性设置Filter执行顺序,最终会传给Filter类型.
3.ActionFilterAttribute类型
ActionFilterAttribute一般用于在Action上或ActionResult创建Filter的基类,定义如下:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
{
// The OnXxx() methods are virtual rather than abstract so that a developer need override
// only the ones that interest him. public virtual void OnActionExecuting(ActionExecutingContext filterContext)
{
} public virtual void OnActionExecuted(ActionExecutedContext filterContext)
{
} public virtual void OnResultExecuting(ResultExecutingContext filterContext)
{
} public virtual void OnResultExecuted(ResultExecutedContext filterContext)
{
}
}
二.特定Filter介绍
1. IAuthenticationFilter
IAuthenticationFilter是MVC5新增加Filter类型,允许实现自定义的身份验证。通过前面的介绍,我们知道它执行在最前面。接口定义如下:
public interface IAuthenticationFilter
{ void OnAuthentication(AuthenticationContext filterContext); void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);
}
由于前面的小节已介绍,这里不再赘述. Controller类实现了该接口, 仅提供了虚方法实现
2. IAuthorizationFilter
该接口执行在Action方法和ActionFilter之前,提供用户授权或其它检查的机会.它的接口定义如下:
public interface IAuthorizationFilter
{
void OnAuthorization(AuthorizationContext filterContext);
}
有一系列类实现了该接口:

a. ValidateAntiForgeryTokenAttribute
ValidateAntiForgeryTokenAttribute 是为防止CSRF(Cross-Site Request Forgery)跨站请求伪造攻击而设计,关于CSRF这里不介绍了,这个属性和HtmlHelper.AntiForgeryToken方法协作,在HtmlHelper.AntiForgeryToken中,生成一个加密的Token放在cookie里,同时在Form里生成一个隐藏的字段,保存与Token相匹配的值,当页面提交时,ValidateAntiForgeryTokenAttribute将验证cookie设置值与Form隐藏字段的值是否匹配,不匹配的话就说明请求是伪造的
b.ValidateInputAttribute
表示对请示输入进行验证的标识,防止网站的恶意攻击,如XSS
它是设置Controller.ValidateRequest属性,具体的验证在HttpRequest.ValidateInput方法中
c.ChildActionOnlyAttribute
标识Action只能作为子Action调用, 当调用Html.Action方法会一个当前Action的ViewContext放到RouteData中,key 为ParentActionViewContextToken,ChildActionOnlyAttribute检查RouteData的Key中是否存在ParentActionViewContextToken
d.AuthorizeAttribute
检查用户是否通过验证(IPrincipal.IIdentity.IsAuthenticated),用户或角色是否在声明的列表中,另外如查Controller 或Action标识为AllowAnonymousAttribute将跳过验证
e.RequireHttpsAttribute
检查当前的连接HttpContext.Request.IsSecureConnection
3. IActionFilter与IResultFilter
这两个接口分别定义的方法执行在Action执行前后和ActionResult执行前后
public interface IActionFilter
{
void OnActionExecuting(ActionExecutingContext filterContext);
void OnActionExecuted(ActionExecutedContext filterContext);
} public interface IResultFilter
{
void OnResultExecuting(ResultExecutingContext filterContext);
void OnResultExecuted(ResultExecutedContext filterContext);
}
相关的继承体系如下所示:

a. OutputCacheAttribute
缓存Action的执行结果,可以指定多种缓存策略和参数,基本的使用见这里http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs
主Action和子Action处理策略有点不同,具体见这里的分析http://www.cnblogs.com/majiang/archive/2012/11/23/2784881.html
另外值得一提的是,当你缓存的内容也许有部分片断需要更新, 比如电子商务的产品展示页面,有一个页面浏览数要实时更新,这个时候可以利用HttpResponse.WriteSubstitution方法动态更新这个字段,可以参考这里http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/adding-dynamic-content-to-a-cached-page-cs
b. AsyncTimeoutAttribute
设置异步操作的超时时间,在OnActionExecuting中Controller的AsyncManager的Timeout属性
4. IExceptionFilter
在Action或其它Filter执行过程中,处理抛出的特定异常
public interface IExceptionFilter
{
void OnException(ExceptionContext filterContext);
}
继承体系如下所示:

a. HandleErrorAttribute
声明异常处理,你可以声明一个异常处理类型(默认是Exception,也就是可以处理所有异常),声明错误处理页面(默认是Error),另外有两点值得注意:
1. 未开启自定义异常错误模式时,这个属性不启作用
<system.web>
<customErrors mode="On"></customErrors>
</system.web>
2. 只处理http状态码是500的错误
详细请参见这里http://freshbrewedcode.com/jonathancreamer/2011/11/29/global-handleerrorattribute-in-asp-net-mvc3/
b. OutputCacheAttribute
前面已介绍,这里是发生异常对子Action的缓存做些清理工作.
5. IOverrideFilter
这个接口是MVC5新加的,允许你在更低一级的范围清除或覆盖上一级的Filter。定义接口下:
public interface IOverrideFilter
{
Type FiltersToOverride { get; }
}
只有一个属性,只明要覆写的Filter类型,具体的类族关系如下图:

关于详细使用参见以下链接
http://weblogs.asp.net/imranbaloch/archive/2013/09/25/new-filter-overrides-in-asp-net-mvc-5-and-asp-net-web-api-2.aspx
http://www.davidhayden.me/blog/filter-overrides-in-asp-net-mvc-5
参考
Filtering in ASP.NET MVC
http://msdn.microsoft.com/en-us/library/gg416513(v=vs.98).aspx
Understanding ASP.NET MVC Filters and Attributes
http://www.dotnet-tricks.com/Tutorial/mvc/b11a280114-Understanding-ASP.NET-MVC-Filters-and-Attributes.html
ASP.NET MVC框架揭密
ASP.NET MVC5学习笔记之Filter基本介绍的更多相关文章
- ASP.NET MVC5学习笔记之Filter提供体系
前面我们介绍了Filter的基本使用,但各种Filter要在合适的时机运行起来,需要预先准备好,现在看看ASP.NET MVC框架是怎么做的. 一.Filter集合 在ControlerActionI ...
- ASP.NET MVC5学习笔记01
由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...
- ASP.NET MVC5学习笔记之Controller同步执行架构分析
在开始之前,声明一下,由于ASP.NET MVC5正式发布了,后面的分析将基于ASP.NET MVC5最新的源代码.在前面的内容我们分析了怎样根据路由信息来确定Controller的类型,并最终生成C ...
- ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器
[TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序,选择MVC,选择添加测试. 在解决方案上右键,选择"管理NuGet程序包& ...
- ASP.NET MVC5 学习笔记-2 Razor
1. Razor @*注释*@ 你在用 @Request.Browser.Browser, 发送邮件给support@qq.com, 转义@@qq @{ var amounts = new List& ...
- ASP.NET MVC5学习笔记之Action参数模型绑定之模型元数据和元数据提供
一. 元数据描述类型ModelMetadata 模型元数据是对Model的描述信息,在ASP.NET MVC框架中有非常重要的作用,在模型绑定,模型验证,模型呈现等许多地方都有它的身影.描述Model ...
- ASP.NET MVC5学习笔记之Action参数模型绑定基本过程
当我们在Controller中定义一个Action,通常会定义一个或多个参数,每个参数称为一个模型,ASP.NET MVC框架提供了一种机制称为模型绑定,会尝试自动从请求的信息中实例化每一个模型并赋值 ...
- ASP.NET MVC5学习笔记之Controller执行ControllerDescriptor和ActionDescriptor
一. ControllerDescriptor说明 ControllerDescriptor是一个抽象类,它定义的接口代码如下: public abstract class ControllerDes ...
- ASP.NET MVC5 学习笔记-4 OWIN和Katana
1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...
随机推荐
- Redis应用
一.什么是Redis? Redis是一个高性能的key-value内存数据库. 二.为什么使用Redis? Redis是NoSQL数据库,相比传统关系型数据库,内存数据库读写更快. 三.Redis怎么 ...
- 【测试】模拟一个全表扫描的sql,对其进行优化走索引,并且将执行计划稳定到baseLine。
①创建表t3: SQL> create table t3 (id int); Table created. SQL; rows created. ②开启自动捕获并修改时间格式: SQL> ...
- 华为OJ平台——完美数
import java.util.Scanner; /** * * 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数. * 它所有的真因子(即除了自身以外的约数)的和(即 ...
- 查询数据库后台Block 的Sql存储过程
查询数据库后台Block 的Sql存储过程 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO /*记录SQL Server的阻塞情况 wang 200 ...
- JS常用的设计模式(13)——组合模式
组合模式又叫部分-整体模式,它将所有对象组合成树形结构.使得用户只需要操作最上层的接口,就可以对所有成员做相同的操作. 一个再好不过的例子就是jquery对象,大家都知道1个jquery对象其实是一组 ...
- Does FTK index search support regular expression?
Some of my friends ask me a question: "Does FTK index search support regular expression?" ...
- javaSE第二十天
第二十天 254 1:递归(理解) 254 (1)方法定义中调用方法本身的现象 254 (2)递归的注意事项 255 (3)递归的案例: 255 A:递归求阶乘 2 ...
- 设计模式-代理模式(Proxy)
应用场景: 领导都有秘书,一般会代理领导的部分职能角色,处理签字.报销.开会等任务.很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在.但是领导的的确确是真实存在的. 场景说明: 代 ...
- 装逼利器之DLog -DEBUG
#ifdef DEBUG #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __L ...
- VMware下安装的Mac OS X如何修改显示分辨率
VMware下安装的Mac OS X如何修改显示分辨率 我在Win7下利用VMware安装了苹果的Mac OS,安装成功启动后,发现分辨率为1920*1080,而宿机的分辨率是1366*768,我 ...