zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    设置 nextjs build 时,忽略 page 目录下相关文件
    Resource Override 之调试线上 js
    nodejs npm 基础命令
    禁止选择或禁止复制网页数据
    对上传的图片进行格式校验以及安全性校验
    docker 设置阿里云镜像加速
    JS 格式化输出时间
    dotnet core 实现 IActionResult
    win10 visual studio 设置默认管理员权限启动
    Windows 环境部署 RabbitMQ
  • 原文地址:https://www.cnblogs.com/hs8888/p/5520577.html
Copyright © 2011-2022 走看看