在项目中很多地方需要用到面向切面的思想,比如说身份验证、日志功能这些。
过滤器可以理解为在执行某个功能时,额外执行的一段代码,在MVC中有Action和result过滤器,
分别都是在执行前和执行后进行过滤的,具体代码如下:
public class MyActionFilterAttribute:ActionFilterAttribute{public string Name { get; set; }public override void OnActionExecuting(ActionExecutingContext filterContext){base.OnActionExecuting(filterContext);HttpContext.Current.Response.Write("<p>Action 开始执行" + Name + "</p>");}public override void OnActionExecuted(ActionExecutedContext filterContext){base.OnActionExecuted(filterContext);HttpContext.Current.Response.Write("<p>Action 执行完成" + Name + "</p>");}public override void OnResultExecuting(ResultExecutingContext filterContext){base.OnResultExecuting(filterContext);HttpContext.Current.Response.Write("<p>Result 开始执行" + Name + "</p>");}public override void OnResultExecuted(ResultExecutedContext filterContext){base.OnResultExecuted(filterContext);HttpContext.Current.Response.Write("<p>Result 执行完成" + Name + "</p>");}}
[MyActionFilter(Name="ActionFilterTest")]public ActionResult ActionFilterTest(){throw new Exception("demo");return Content("页面加载完成");}
其中注意,过滤器特性的位置还可以放到controller的上面,代表这个控制器下所有的Action方法都执行这个过滤器,也可以放到Global.asax文件中,代表整个项目都执行这个过滤器。
过滤器是有执行优先级的,最靠近Action的过滤器才会执行。
那么如果想一个Action执行多个过滤器,就需要再添加一个新的特性。
[AttributeUsage(AttributeTargets.All,AllowMultiple=true)] public class HomeController : Controller
其中AllowMultiple=true属性是允许多个特性一起执行,执行的时候顺序会是先global中的过滤器,以此类推,最后正着进去,反着出来。
异常过滤器
异常过滤器:当项目中出现异常时,就会自动执行异常过滤器中的代码。先添加一个类。
public class MyExceptonFilterAttribute:HandleErrorAttribute{public override void OnException(ExceptionContext filterContext){
base.OnException(filterContext);HttpContext.Current.Response.Redirect("/Home/Index");}}
然后在global页面中添加异常的过滤器。
public static void RegisterGlobalFilters(GlobalFilterCollection filters){// filters.Add(new HandleErrorAttribute()); //换自己的filters.Add(new MyExceptonFilterAttribute());}
这里做的是跳转至错误页面,其实应该记录日志文件,思路大概是使用线程访问文件,然后记录,但是以后用户会非常多,
所以就需要考虑到多线程操作这个文件,用线程锁的方式记录,但是这样会很影响性能。
所以应该考虑使用使用内存列队来提高性能 Redis,日志信息直接放进内存中,然后在用一个线程读取并写入日志文件,这样就不会让用户等待。
在项目中,一般使用log4net组件,进行记录日志。
总结:过滤器大概的流程为继承ActionFilterAttribute和HandleErrorAttribute类,然后重写里面的方法。
最后为需要过滤的Action加上特性就可以了。