什么是AOP?
:AOP(面向切面编程)是一种架构思想,用于把公共的逻辑放到一个单独的地方,这样就不用每个地方都写重复的代码了。比如程序中发生异常,不用每个地方都try....catch... 只要在(Global的Application_Error)中统一进行异常处理,不用每个Action中都检查当前用户是否有执行权限,Asp.net Mvc中提供了一个机制,每个Action执行之前都会执行我们的代码,这样统一检查,一夫当关,万夫莫开!
四种Filter:
在ASP.ENT MVC 中提供了四个Filter(过滤器) 接口实现了这种AOP机制:
IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter。
1)IAuthorizationFilter一般用来检查当前用户是否有Action的执行权限,在每个Action执行前执行OnAuthorization方法:
2)IActionFilter也是在每个Action被执行前执行OnActionExecuting方法,每个Action执行完成后执行OnActionExecuted方法。和IAuthorizationFilter的区别是IAuthorizationFilter在IActionFilter之前执行,检查权限一般写到IAuthorizationFilter中;
3)IResultFilter,在每个ActionResult的前后执行IResultFilter。用的很少,后面有一个应用。
4)IExceptionFilter,当Action执行发生未处理异常的时候执行OnException方法
定义的类可以在Global中GlobalFilters.Add(new XXXFilter());的方式添加为全局
1:安装程序集 Install-Package Log4NET
2:在Web.config 中添加节点
<configuration>
配置节点
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
</configuration>
配置节点
<log4net>
<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<!-- Set root logger level to ERROR and its appenders -->
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileTracer" />
</root>
<!-- Print only messages of level DEBUG or above in the packages -->
<appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="App_Data/Log/" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Composite" />
<param name="MaxSizeRollBackups" value="10" />
<param name="MaximumFileSize" value="1MB" />
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
</log4net>
3:在Global 文件中启动
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
1:在App_Start文件夹中新建一个类继承IExceptionFilter接口,实现接口中的OnException方法 如下
namespace ZFXT.App_Start
{
public class ZSZExceptionFilter:IExceptionFilter
{
private static ILog log = LogManager.GetLogger(typeof(ZSZExceptionFilter));
public void OnException(ExceptionContext filterContext)
{
log.ErrorFormat("出现未处理的异常{0}",filterContext.Exception);
}
}
}
最后把自定义的类添加到Global文件中
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
GlobalFilters.Filters.Add(new App_Start.ZSZExceptionFilter());
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}