说明:本内容来自微软的webcast,讲师为苏鹏。视频没有书方便(想看哪页就看哪页),所以抄录要点和老师语录。
内容介绍
- 基于Filter的使用
- 自定义开发Filter
预备知识
- 安装VS2010
- 了解ASP.NET
- 了解设计模式基本概念
Filter的作用
- 对Action 的附加说明
Filter的真正作用——对Action如何使用作详细的说明。
不一定所有的Filter类都是限制用户执行或允许用户执行.
ASP.NET MVC 中的Filer
- Authorize
- HandleError
- OutputCache
- RequireHttps
授权
异常处理
限制输出的内容,缓存内容
http传输内容加密,SSL加密层的协议。
Authorize
- AuthorizeAttribute标签
该标签从MVC1就有,用来限制用户是否有权限访问Action。
可以限制某个操作只能被某个用户使用,例如DeleteAllUsers()只有Phil可使用。
登录页面也可以在webconfig中配置。
Requirehttps
它要求您的请求必须是https。
它既可以放在controller又可以放在Action上。
放在controller上所有的Action都必须符合https。
如果不是https,但是是Get请求,则会转为https请求。而且web服务器要支持https。
Post请求,没办法自动转为https,则会抛出异常。
OutputCache
跟asp.net2005很类似
OutputCache写法——写在Action上
需要缓存的是数据
SqlDependency——根据Sql数据库某一表的值进行缓存的,当值改变的时候缓存的值释放,当值没有变的时候,保持缓存。
VaryByContentEncoding——3.5新特性,它是用一个逗号分割字符串,说明内容编码的格式。
VaryByCustom——是否缓存取决于GetVaryByCustom()函数,函数在global.asax.cs里,重载GetVaryByCustom()函数,就可以自己订制。
VaryByHeader——做缓存释放,根据http header释放缓存。
VaryByParam——以参数的方式释放缓存。参数值的变化会导致缓存。
OutputCache config里的配置
很多Outputcache 设置一样,使用配置文件达到复用的目的。
Exception Filter
它去指定一个Action去处理异常,并且指定一个view来显示指定的异常。
没有指定显示错误View的话,默认显示错误的View是Error,它在Share文件夹下。
异常的定义,从小到大写。Order越小越先执行。
Custom Filters
- IAuthorizationFilter
- IActionFilter
- IResultFilter
- IExceptionFilter
ActionFilterAttribute类
Ø 自定义filter——继承FilterAttribute这个基础类,并且实现上面四个其中一个接口。
Ø IActionFilter——在Action执行前和执行中做操作。
Ø IResultFilter——执行后和返回前做操作的
Ø 如果在Action执行的过程中,加入自己的逻辑,可以实现IActionFilter和IResultFilter。
Ø IAuthorizationFilter和IExceptionFilter——授权和异常,通常是给Framework用的,自己没必要实现和修改它,但是也是可以修改的。
ActionFilterAttribute
ActionFilterAttribute它有四个虚函数。它对应Action四个执行过程。
ActionExecuted——Action还没被执行之前
ActionExecuting——Action正在执行
ResultExecuted——正在生成执行结果
ResultExecuting——执行结果生成往用户端发送结果之前,这一时间段。
四个有不同的事件,请求上下文作为参数可以使用。
ActionExcetingContext
ActionParameters
Result
Ø Action正在执行的时候
Ø ActionParameters——它是字典类,存储传递给Action的参数。
Ø Result——当前请求被取消的时候,Filter会自己生成一个ActionResult 来代替从Action传出来的结果,把它传给用户。
Ø 用户请求有问题,不想让用户执行这个Action,这时候有一个Cancel的属性就被设为true,不是ExcetingContext的属性,而是ExcetedContext的属性。
ActionExecutedContext
- Canceled
- Exception
- ExceptionHandled
- Result
Ø 重要,头一个属性最重要。
Ø Canceled——布尔。如果设为true的话,那么就认为这个请求被取消了。这个Action就不执行了,然后就直接构造一个Result给ActionContextResult,返回ActionContextResult。用户看到不是预期的,是因为请求被取消了。
Exception——Filter抛出异常时,他会记住这个异常。
ExceptionHandled——布尔。
Ø 例如:如果true的话,两个ActionFilter,A和B。A在B之前执行了,如果Action 结果返回一个ViewResult,A执行完了,没问题。该B执行了,执行OnActionExecuted的时候,抛出异常了。A的OnActionExcuted()方法永远没有办法看到Action返回的ViewResult。
Ø 解释:用这种方法撤销已经返回的ActionResult,无论你在第几个执行,只要OnActionExceting结果的ActionExecutedContext里的ExceptionHandled=true,即抛出异常。则所有的监视这个Action的Filter谁都拿不到ActionResulte,即Result 永远丢失了。
Result——Action的返回结果。主要用来修改结果返回的视图或者生成一个假的。
ResultExecutingContext
- Cancel
- Result
Cancle——是否返回生成结果。
ResultExecutedContext
- Canceled
- Exception
- ExceptionHandled
- Result
它和ActionExecutedContext类似。
编写ActionFilter
自定义Filter时以Attribute后缀,意义是说明它是一个标签。
使用时,用Filter名字,即去掉Attribute后缀。
Filter执行顺序
- 1.Order 小的先执行
- 2.具有同样Order的,看定义范围
- 3.无Order的最后执行
- 4.代码内部定义的优先执行
- 5.同类型的filter无法确定执行顺序
Ø Order——约束Filter执行顺序
Ø 范围——一个定义在Action,一个定义在Controller,则Controller上的Filter会先执行
Ø 加入OnActionExcuted这类接口,有最大优先级,会比所有的Filter都先执行。在Action里面,自己写了OnActionExcuting()方法,那么它就会先执行。
Ø 同类型的filte,好几个都是HandleErrorResult,没有写Orders,放在一起,执行顺序不确定。所以强调要写Order
总结
- 基本Filter的使用。
- 自定义开发Filter
附:
标题:粗体+斜体+黑色
ppt文字:宋体+黑色
作者语录:斜体+黑色/红色/蓝色
我的心得:@开头