[MSDN]ASP.NET MVC2(9)使用Filter特性

说明:本内容来自微软的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

clip_image002

可以限制某个操作只能被某个用户使用,例如DeleteAllUsers()只有Phil可使用。

clip_image004

登录页面也可以在webconfig中配置。

Requirehttps

它要求您的请求必须是https

它既可以放在controller又可以放在Action上。

放在controller上所有的Action都必须符合https

如果不是https,但是是Get请求,则会转为https请求。而且web服务器要支持https

Post请求,没办法自动转为https,则会抛出异常。

OutputCache

clip_image006

asp.net2005很类似

OutputCache写法——写在Action

需要缓存的是数据

SqlDependency——根据Sql数据库某一表的值进行缓存的,当值改变的时候缓存的值释放,当值没有变的时候,保持缓存。

VaryByContentEncoding——3.5新特性,它是用一个逗号分割字符串,说明内容编码的格式。

VaryByCustom——是否缓存取决于GetVaryByCustom()函数,函数在global.asax.cs里,重载GetVaryByCustom()函数,就可以自己订制。

VaryByHeader——做缓存释放,根据http header释放缓存。

VaryByParam——以参数的方式释放缓存。参数值的变化会导致缓存。

OutputCache config里的配置

很多Outputcache 设置一样,使用配置文件达到复用的目的。

clip_image008

Exception Filter

clip_image010

它去指定一个Action去处理异常,并且指定一个view来显示指定的异常。

没有指定显示错误View的话,默认显示错误的ViewError,它在Share文件夹下。

异常的定义,从小到大写。Order越小越先执行。

Custom Filters

-          IAuthorizationFilter

-          IActionFilter

-          IResultFilter

-          IExceptionFilter

ActionFilterAttribute

Ø         自定义filter——继承FilterAttribute这个基础类,并且实现上面四个其中一个接口。

Ø         IActionFilter——在Action执行前和执行中做操作。

Ø         IResultFilter——执行后和返回前做操作的

Ø         如果在Action执行的过程中,加入自己的逻辑,可以实现IActionFilterIResultFilter

Ø         IAuthorizationFilterIExceptionFilter——授权和异常,通常是给Framework用的,自己没必要实现和修改它,但是也是可以修改的。

ActionFilterAttribute

clip_image012

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就不执行了,然后就直接构造一个ResultActionContextResult,返回ActionContextResult。用户看到不是预期的,是因为请求被取消了。

Exception——Filter抛出异常时,他会记住这个异常。

ExceptionHandled——布尔。

Ø         例如:如果true的话,两个ActionFilterABAB之前执行了,如果Action 结果返回一个ViewResultA执行完了,没问题。该B执行了,执行OnActionExecuted的时候,抛出异常了。AOnActionExcuted()方法永远没有办法看到Action返回的ViewResult

Ø         解释:用这种方法撤销已经返回的ActionResult,无论你在第几个执行,只要OnActionExceting结果的ActionExecutedContext里的ExceptionHandled=true,即抛出异常。则所有的监视这个ActionFilter谁都拿不到ActionResulte,即Result 永远丢失了。

Result——Action的返回结果。主要用来修改结果返回的视图或者生成一个假的。

ResultExecutingContext

-          Cancel

-          Result

Cancle——是否返回生成结果。

ResultExecutedContext

-          Canceled

-          Exception

-          ExceptionHandled

-          Result

它和ActionExecutedContext类似。

编写ActionFilter

自定义Filter时以Attribute后缀,意义是说明它是一个标签。

使用时,用Filter名字,即去掉Attribute后缀。

clip_image014

clip_image016

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文字:宋体+黑色

作者语录:斜体+黑色/红色/蓝色

我的心得:@开头

原文地址:https://www.cnblogs.com/htht66/p/2330826.html