MVC学习系列——Filter扩展

在MVC中,Filter也是可以扩展的。在此,本人对Filter的理解就是AOP,不知道各位大侠,有什么高的见解,呵呵。。。

首先MVC四大过滤神器IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter。

在此之前,我们先安装Log4net日志神器:

看下项目的引用

配置文件

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <configSections>
 4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 5   </configSections>
 6   <log4net>
 7     <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
 8       <!--日志路径-->
 9       <param name= "File" value= "D:App_Log"/>
10       <!--是否是向文件中追加日志-->
11       <param name= "AppendToFile" value= "true"/>
12       <!--log保留天数-->
13       <param name= "MaxSizeRollBackups" value= "10"/>
14       <!--日志文件名是否是固定不变的-->
15       <param name= "StaticLogFileName" value= "false"/>
16       <!--日志文件名格式为:2008-08-31.log-->
17       <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
18       <!--日志根据日期滚动-->
19       <param name= "RollingStyle" value= "Date"/>
20       <layout type="log4net.Layout.PatternLayout">
21         <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />
22       </layout>
23     </appender>
24     <!-- 控制台前台显示日志 -->
25     <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
26       <mapping>
27         <level value="ERROR" />
28         <foreColor value="Red, HighIntensity" />
29       </mapping>
30       <mapping>
31         <level value="Info" />
32         <foreColor value="Green" />
33       </mapping>
34       <layout type="log4net.Layout.PatternLayout">
35         <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
36       </layout>
37 
38       <filter type="log4net.Filter.LevelRangeFilter">
39         <param name="LevelMin" value="Info" />
40         <param name="LevelMax" value="Fatal" />
41       </filter>
42     </appender>
43     <root>
44       <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
45       <level value="all" />
46       <appender-ref ref="ColoredConsoleAppender"/>
47       <appender-ref ref="RollingLogFileAppender"/>
48     </root>
49   </log4net>
50   <system.web>
51     <compilation debug="true" targetFramework="4.5.2" />
52     <httpRuntime targetFramework="4.5.2" />
53   </system.web>
54 </configuration>
复制代码

增加LogHelper帮助类

复制代码
 1  public class LogHelper
 2     {
 3         public static void WriteLog_Error(Type t, Exception ex)
 4         {
 5             log4net.ILog log = log4net.LogManager.GetLogger(t);
 6             log.Error("Unhandled exception", ex);
 7         }
 8 
 9         public static void WriteLog_Error(Type t, string msg)
10         {
11             log4net.ILog log = log4net.LogManager.GetLogger(t);
12             log.Error(msg);
13         }
14 
15         public static void WriteLog_Info(Type t, string msg)
16         {
17             log4net.ILog log = log4net.LogManager.GetLogger(t);
18             log.Info(msg);
19         }
20     }
复制代码

还有一个重要的一步,在Gobal类中,要申明:

1 //加载配置文件
2             var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.config");
3             XmlConfigurator.ConfigureAndWatch(logCfg);

ok,到这里log4net,配置完成。


现在,我来扩展IExceptionFilter这个过滤器。

新建Log4NetExceptionFilter类,继承接口IExceptionFilter

复制代码
1 public class Log4NetExceptionFilter : IExceptionFilter
2     {
3         public void OnException(ExceptionContext filterContext)
4         {
5             LogHelper.WriteLog_Error(GetType(), filterContext.Exception);
6         }
7     }
复制代码

在FilterConfig中申明自己的异常处理:

复制代码
1  public class FilterConfig
2     {
3         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
4         {
5             //filters.Add(new HandleErrorAttribute());
6             //加上自己的异常
7             filters.Add(new Log4NetExceptionFilter());
8         }
9     }
复制代码

测试:在HomeController的GetXmlResult,手工增加异常:

复制代码
 1  public XmlResult GetXmlResult()
 2         {
 3             int a = 1;
 4             int b = 0;
 5             int c = a / b;
 6 
 7             StudentViewModel viewModel = new StudentViewModel();
 8             viewModel.ID = "1";
 9             viewModel.Name ="Zhangsan";
10             viewModel.Gender = "Man";
11 
12             return new XmlResult(viewModel);
13         }
复制代码

结果:

在介绍一下ActionFilterAttribute,这个特性有两个接口IActionFilter, IResultFilter。

因此,新建MyActionFilterAttribute,继承于ActionFilterAttribute

复制代码
 1 public class MyActionFilterAttribute: ActionFilterAttribute
 2     {
 3         public override void OnActionExecuting(ActionExecutingContext filterContext)
 4         {
 5             LogHelper.WriteLog_Info(GetType(), "OnActionExecuting");
 6             base.OnActionExecuting(filterContext);
 7         }
 8         public override void OnActionExecuted(ActionExecutedContext filterContext)
 9         {
10             LogHelper.WriteLog_Info(GetType(), "OnActionExecuted");
11             base.OnActionExecuted(filterContext);
12         }
13 
14         public override void OnResultExecuting(ResultExecutingContext filterContext)
15         {
16             LogHelper.WriteLog_Info(GetType(), "OnResultExecuting");
17             base.OnResultExecuting(filterContext);
18         }
19 
20         public override void OnResultExecuted(ResultExecutedContext filterContext)
21         {
22             LogHelper.WriteLog_Info(GetType(), "OnResultExecuted");
23             base.OnResultExecuted(filterContext);
24         }
25     }
复制代码

测试:在HomeController的GetXmlResult的方法上,增加MyActionFilterAttribute特性。ps:这里已经去掉刚刚手工增加的异常。

复制代码
  [MyActionFilterAttribute]
        public XmlResult GetXmlResult()
        {
            StudentViewModel viewModel = new StudentViewModel();
            viewModel.ID = "1";
            viewModel.Name ="Zhangsan";
            viewModel.Gender = "Man";
            return new XmlResult(viewModel);
        }
复制代码

结果:

 出自http://www.cnblogs.com/xuliang1992/p/5328391.html

原文地址:https://www.cnblogs.com/hs8888/p/5520577.html