前言:html
MVC如今已經成爲web開發的一個主流趨勢了,還沒用過的小夥伴,大家已經落伍了,這裏我推薦一篇學習博客 玩轉Asp.net MVC 的八個擴展點 代碼徹底開源,下載地址:https://git.oschina.net/tibos/LSJ_NHibernategit
Global 全局應用程序處理的入口,在這個裏面能夠幹不少事,好比把一些公共的東西綁定進去,這裏不知不覺就用到一個知識,面向切面編程AOPweb
最經常使用的,咱們把驗證用戶身份,記錄用戶操做信息....這些記爲橫切關注點,咱們進行每一個操做的時候都要驗證用戶憑證是否失效,幹了些什麼事,若是每一個請求都寫,代碼就冗餘了,也不便於後期的維護,咱們提取成橫切關注點後,只用寫一遍代碼就能輕鬆實現了.數據庫
爲此,MVC給咱們提供了很好的拓展,咱們從新ActionFilterAttribute裏面的方法便可編程
咱們重寫這4個方法便可mvc
1 // OnActionExecuted 在執行操做方法後由 ASP.NET MVC 框架調用。 2 // OnActionExecuting 在執行操做方法以前由 ASP.NET MVC 框架調用。 3 // OnResultExecuted 在執行操做結果後由 ASP.NET MVC 框架調用。 4 // OnResultExecuting 在執行操做結果以前由 ASP.NET MVC 框架調用。
用Log4net記錄這些請求框架
順便也能夠記錄到數據庫,作操做日誌ide
保存用戶憑證我用的是forms表單驗證,MVC默認是支持的,設置起來也很是簡單post
1 <authentication mode="Forms"> 2 <forms loginUrl="~/Home/Login" timeout="2880" /> 3 </authentication> 4 <authorization> 5 <deny users="?" /> 6 </authorization>
設置成沒有登入的用戶不能訪問,在Global將事件註冊到mvc學習
1 public MvcApplication() 2 { 3 AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest); 4 } 5 6 void MvcApplication_AuthorizeRequest(object sender, EventArgs e) 7 { 8 IIdentity id = Context.User.Identity; 9 if (id.IsAuthenticated) 10 { 11 12 var roles = new DAO.BLL.B_Manager().GetRoles(id.Name); 13 Context.User = new GenericPrincipal(id, roles); 14 } 15 }
這樣進行全部的操做,forms都會驗證用戶是否登陸,再結合OnActionExecuting進行權限驗證,沒有權限的就直接返回一個空視圖便可!
用forms保存憑證的要注意一點,對於沒有登陸的用戶,項目下的全部資源都沒法訪問,如js,img....因此這裏必須將不須要驗證的文件開放訪問權限,在配置文件裏設置,以下
1 <!--這些資源是不用權限判斷的--> 2 <location path="img"> 3 <system.web> 4 <authorization> 5 <allow users="*" /> 6 </authorization> 7 </system.web> 8 </location>
最後一個須要捕獲的就是錯誤日誌,重寫HandleErrorAttribute方法便可
1 /// <summary> 2 /// 捕獲程序出錯日誌 3 /// </summary> 4 public class Log4NetExceptionFilter : HandleErrorAttribute 5 { 6 7 public override void OnException(ExceptionContext filterContext) 8 { 9 string message = string.Format("消息類型:{0}<br>消息內容:{1}<br>引起異常的方法:{2}<br>引起異常源:{3}" 10 , filterContext.Exception.GetType().Name 11 , filterContext.Exception.Message 12 , filterContext.Exception.TargetSite 13 , filterContext.Exception.Source + filterContext.Exception.StackTrace 14 ); 15 16 //記錄日誌 17 CZLogger.Logger.Error(message); 18 19 //拋出異常信息 20 filterContext.Controller.TempData["ExceptionAttributeMessages"] = message; 21 22 //轉向 23 filterContext.ExceptionHandled = true; 24 filterContext.Result = new RedirectResult("/Home/Error/"); 25 } 26 }
將記錄錯誤日誌方法寫入RegisterGlobalFilters便可.