----------------------------------------------
注:ActionFilterAttribute类既实现了IActionFilter,也实现IResultFilter接口。是一个抽象类,要求你必须提供一个实现(派生类)。
而 AuthorizeAttibute和HandleErrorAttribute,则包含了一些有用的特性,并且可以不必创建派生类进行使用。
注:如果为控制器定义了一个自定义基类,那么运用于基类上的任何过滤器都会影响其派生类。
注:在使用HandleError过滤器是会有一个奇怪的行为:视图中必须包含Model.Exception.StackTrace属性的值,
否则视图便不会显示给用户。一般Model.Exception.StackTrace放在Div中,CSS的display=none。
<div style="display:none">
@Model.exception:StrackTrace
</div>
----------------------------------------------
一、使用过滤器
1.过滤器:把附加逻辑注入到MVC框架的请求处理。是.NET的注解属性(Attribute),对请求处理管道添加了额外的步骤。
2.注解属性:派生于System.Attribute的特殊的.NET类。可以附加到其他代码元素(类、方法、属性、字段等)上。
目的是把附加信息嵌入到已编译的代码中,以便在运行时读回信息。
在C#中注解属性以Atttibute结尾,用方括号[]进行附加,可以用已命名参数语法给它们的属性(public)赋值,
在使用注解属性时,尾部的Attibute是省略的:AuthorizeAttibute->[Authorize]
3.交叉关注:可以用于整个应用程序,而又不适合旋转在某个局部位置的功能,否则会打破关注分离模式(登录、授权、缓存等)。
MVC框架的过滤器类型
过滤器类型 | 接口 | 默认实现 | 描述 |
Authorization(认证) | IAuthorizationFilter | AuthorizeAttibute | 最先运行,在任何其它过滤器或动作方法之前 |
Action(动作) | IActionFilter | ActionFilterAttribute | 在动作方法之前及之后运行 |
Result(结果) | IResultFilter | ActionFiterAttribute | 在动作结果被执行之前和之后运行 |
Exception(异常) | IExceptionFiter | HandleErrorAttribute | 仅在另一个过滤器、动作方法、或动作结果抛出异常时运行 |
4.内建授权过滤器:(AuthorizeAttribute)
(1)属性 Users:string 一个逗号分隔的用户名列表,允许这些用户访问该动作方法
(2)属性 Roles:string 一个逗号分隔的角色列表。为了访问该动作方法,用户必须至少是这些角色之一
5.异常过滤器:(HandleErrorAttribute)
(1)异常过滤器的主要应用:1.对异常进行日志,2.将适当的消息显示给用户。
ExceptionContext属性
名称 | 类型 | 描述 |
Controller | ControllerBase | 返回请求的控制器对象 |
HttpContext | HttpContextBase | 提供对请求细节的访问,以及对响应的访问 |
IsChildAction | bool | 子动作判断 |
RequestContext | RequestContext | 提供HttpContext和路由数据的访问 |
RouteData | RouteData | 返回请求的路由数据 |
ExceptionContext额外的属性
名称 | 类型 | 描述 |
ActionDescriptor | ActionDescriptor | 提供动作方法的细节 |
Result | ActionResult | 用于动作方法的结果 |
Exception | Exception | 未处理异常 |
ExceptionHandled | bool | 如果别的过滤器已经把这个异常标记为“已处理”,则返回true |
HandleErrorAttribute属性
名称 | 类型 | 描述 |
ExceptionType | Type | 由过滤器处理的异常类型。它也处理通过给定值继承而来的异常类型,但会忽略所有其他类型。默认为System.Exception,默认处理所有标准异常 |
View | string | 该过滤器渲染的视图名。默认是Error。默认渲染/View/<cuttentControllerName>/Error.html或/View/Shared/Error.htm |
Master | string | 在渲染这个过滤器的视图时所使用的布局名称。默认布局页面 |
(2)使用内建异常过滤器要在Web.config中〈system.web〉节点中〈pages〉节点之后增加
〈/pages〉〈customErrors mode="on" defaultRedirect="/Content/RangeErrorPage.html" /〉〈/system.web〉
mode:默认是RemoteOnly,指在开发期间,HandleErrorAttribute将不会拦截异常,只是部署之后,并从另一台电脑发出请求时,才生效。
deaultRedirect:指定一个内容页面,在其他情况下都无法显示异常消息时,便使用该页面。
[HandleError(ExceptionType=typeof(ArgumentOutOfRangeException),View="RangeError)]
HandleErrorAttribute 过滤器会传递一个HandleErrorInfo
HandleErrorInfo属性
名称 | 类型 | 描述 |
ActionName | string | 生成异常的动作方法名称 |
ControllerName | string | 生成异常的控制器名称 |
Exception | Exception | 此异常 |
6.动作过滤器:(IAactionFilter接口)
OnActionExecuting:动作方法执行之前调用。
作用:检测请求,取消请求,修改请求,启动一些跨越动作调用期间的活动。
参数:ActionExecutingContext对象,继承自ControllerContext类。
ActionExecutingContext属性
名称 | 类型 | 描述 |
ActionDescriptor | ActionDescriptor | 提供动作方法的细节 |
Result | ActionResult | 动作方法的结果;通过将该属性设置为非空值,过滤器可以取消该请求 |
OnActionExcuted:动作方法执行之后调用 。
作用:启动一些跨越动作调用期间的活动。
参数:ActionExecutedContext对象。
ActionExecutedContext属性
名称 | 类型 | 描述 |
ActionDescriptor | ActionDescriptor | 提供动作方法的细节 |
Canceled | bool | 如果该动作已经被另一个过滤器取消,则为true |
Exception | Exception | 返回由另一个过滤器或动作方法抛出的异常 |
ExceptionHandle | bool | 如果异常已经被处理,则为true |
Result | ActionResult | 动作方法的结果;通过将该属性设置为非空值,过滤器可以取消该请求 |
另一个过滤器通过对Result属性设置一个值的方法来取消此请求.
从OnActionExecuting方法被调用开始,Canceled就返回true,OnActionExecuted方法仍然会调用,只不过是为了清理和释放资源。
7.结果过滤器:(IResultFilter接口)
OnResultExecuting:在动作方法返回动作结果之时,在执行该动作结果之前,调用OnResultExecuting方法。
参数:ResultExecutingContext对象。
OnResultExecuted:在动作方法返回动作结果之时,在执行该动作结果之后,调用OnResultExecuted方法。
参数:ResultExecutedContext对象。
8.内建的动作过滤器和结果过滤器(ActionFilterAttribute)
四个方法:OnActionExecuting、OnActionExecuted、OnResultExecuting、OnResultExecuted。
9.其他过滤器特性:
(1)无注解属性过滤:重写On****方法,(不建议使用)
(2)全局过滤器:App_Start/FilterConfig.cs中定义RegisterGlobalFilters方法(过滤器完成类名)
(3)过滤器的执行排序:(默认)授权->动作->结果。
使用过滤器的Order属性进行排序,升序(最小先执行)执行。默认是-1,最先执行。
全局过滤器->类过滤器->方法过滤器。
注:异常过滤器的执行顺序是倒过来的:全局过滤器<-类过滤器<-方法过滤器。
10.内建过滤器:
过滤器 | 描述 |
RequireHttps | 强迫对动作使用HTTPS协议 |
OutputCache | 缓存一个动作方法的输出 |
ValidateInputand ValidationAntiForgeryToken |
与安全性相关的授权过滤器 |
AsyncTimeout NoAsyncTimeout |
用于异步控制器 |
ChildActionOnlyAttribute | 一个支持Html.Action和Html.RanderAction辅助器方法的授权过滤器 |
OutputCache过滤器的参数
参数 | 类型 | 描述 |
Duration | int | 必须,指定维持输出缓存的时间(秒) |
VaryByParam | string(逗号分隔列表) |
为每个与这些名称匹配的Request.QueryString和Request.Form值的结合使用不同的缓存条目:默认none表示“不随查询字符串或表值而变”; “*”表示“随查询字符串或表值而变” |
VaryByHeader | string(逗号分隔列表) | 为每个在这些HTTP报头名称中发送的组合值使用不同的缓存条目 |
VaryByCustom | string | 调用Global.asax中的GetVaryByCustomString访求,以这个任意字符串值作为参数进行传递,生成自己的缓存键值(不同浏览器(版本)使用不同的缓存机制) |
VaryByContentEncoding | string(逗号分隔列表) | 对每个内容编码(Gzip、deflate等文件压缩的编码横笔)创建独立的缓存条目,内容编码可能是由浏览器请求的(下载文件时) |
Location | OutputCacheLocation |
枚举值,输出缓存的地方: Server-服务器内存中; Client-客户端内存中; DownStream-客户端浏览器或HTTP缓存的中间设备中; ServerAndClient-组合; Any(默认)-Server和DownStream组合; None-不缓存。 |
NoStore | bool | 只用于保护十分敏感的数据。true表示发送一个Cach-Control:no-store(不存储)报头给浏览器,指定浏览器缓存页面的时间小于显示它的时间。 |
CacheProfile | string | Web.config中<outputCacheSettings>特定小节中缓存设置 |
SqlDependency | string | 格式:“数据库/表名”对。数据库中数据变化后,缓存数据自动过期。(缓存依赖性特性,设置复杂) |
提示:在缓存开始之前,可能要对页面做一次额外的刷新,第一次启动时,会对视图进行编译。