MVC3学习 八 Action和result过滤器及日志处理
在項(xiàng)目中很多地方需要用到面向切面的思想,比如說(shuō)身份驗(yàn)證、日志功能這些。
過濾器可以理解為在執(zhí)行某個(gè)功能時(shí),額外執(zhí)行的一段代碼,在MVC中有Action和result過濾器,
分別都是在執(zhí)行前和執(zhí)行后進(jìn)行過濾的,具體代碼如下:
public class MyActionFilterAttribute:ActionFilterAttribute{public string Name { get; set; }public override void OnActionExecuting(ActionExecutingContext filterContext){base.OnActionExecuting(filterContext);HttpContext.Current.Response.Write("<p>Action 開始執(zhí)行" + Name + "</p>");}public override void OnActionExecuted(ActionExecutedContext filterContext){base.OnActionExecuted(filterContext);HttpContext.Current.Response.Write("<p>Action 執(zhí)行完成" + Name + "</p>");}public override void OnResultExecuting(ResultExecutingContext filterContext){base.OnResultExecuting(filterContext);HttpContext.Current.Response.Write("<p>Result 開始執(zhí)行" + Name + "</p>");}public override void OnResultExecuted(ResultExecutedContext filterContext){base.OnResultExecuted(filterContext);HttpContext.Current.Response.Write("<p>Result 執(zhí)行完成" + Name + "</p>");}} [MyActionFilter(Name="ActionFilterTest")]public ActionResult ActionFilterTest(){throw new Exception("demo");return Content("頁(yè)面加載完成");}其中注意,過濾器特性的位置還可以放到controller的上面,代表這個(gè)控制器下所有的Action方法都執(zhí)行這個(gè)過濾器,也可以放到Global.asax文件中,代表整個(gè)項(xiàng)目都執(zhí)行這個(gè)過濾器。
過濾器是有執(zhí)行優(yōu)先級(jí)的,最靠近Action的過濾器才會(huì)執(zhí)行。
那么如果想一個(gè)Action執(zhí)行多個(gè)過濾器,就需要再添加一個(gè)新的特性。
[AttributeUsage(AttributeTargets.All,AllowMultiple=true)] public class HomeController : Controller其中AllowMultiple=true屬性是允許多個(gè)特性一起執(zhí)行,執(zhí)行的時(shí)候順序會(huì)是先global中的過濾器,以此類推,最后正著進(jìn)去,反著出來(lái)。
異常過濾器
異常過濾器:當(dāng)項(xiàng)目中出現(xiàn)異常時(shí),就會(huì)自動(dòng)執(zhí)行異常過濾器中的代碼。先添加一個(gè)類。
?
public class MyExceptonFilterAttribute:HandleErrorAttribute{public override void OnException(ExceptionContext filterContext){base.OnException(filterContext);HttpContext.Current.Response.Redirect("/Home/Index");}}
?
然后在global頁(yè)面中添加異常的過濾器。
public static void RegisterGlobalFilters(GlobalFilterCollection filters){// filters.Add(new HandleErrorAttribute()); //換自己的filters.Add(new MyExceptonFilterAttribute());}這里做的是跳轉(zhuǎn)至錯(cuò)誤頁(yè)面,其實(shí)應(yīng)該記錄日志文件,思路大概是使用線程訪問文件,然后記錄,但是以后用戶會(huì)非常多,
所以就需要考慮到多線程操作這個(gè)文件,用線程鎖的方式記錄,但是這樣會(huì)很影響性能。
所以應(yīng)該考慮使用使用內(nèi)存列隊(duì)來(lái)提高性能 Redis,日志信息直接放進(jìn)內(nèi)存中,然后在用一個(gè)線程讀取并寫入日志文件,這樣就不會(huì)讓用戶等待。
在項(xiàng)目中,一般使用log4net組件,進(jìn)行記錄日志。
?
總結(jié):過濾器大概的流程為繼承ActionFilterAttribute和HandleErrorAttribute類,然后重寫里面的方法。
最后為需要過濾的Action加上特性就可以了。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/y8932809/p/4408899.html
總結(jié)
以上是生活随笔為你收集整理的MVC3学习 八 Action和result过滤器及日志处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个数字中1的个数
- 下一篇: 创建featureclass,为它赋别名