LSJ_NHibernate第四章 MVC 玩转Asp.net MVC 的八个扩展点

前言: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便可.

相关文章
相关标签/搜索