MVC3学习 八 Action和result过滤器及日志处理
在項目中很多地方需要用到面向切面的思想,比如說身份驗證、日志功能這些。
過濾器可以理解為在執行某個功能時,額外執行的一段代碼,在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加上特性就可以了。
?
?
轉載于:https://www.cnblogs.com/y8932809/p/4408899.html
總結
以上是生活随笔為你收集整理的MVC3学习 八 Action和result过滤器及日志处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个数字中1的个数
- 下一篇: 《C++ Primer 4th》读书笔记