ASP.NET MVC自定义过滤属性实现log功能

作者:控件中国网   出处:控件中国网   2015-08-20 15:45:14   阅读:23

本文将为大家介绍ASP.NET MVC自定义过滤属性实现Enterprise的log功能,希望对大家用好MVC有所帮助。

ASP.NET MVC的filter 是一个属性,可以应用到controller 后者action.当Controller或者action method 被调用时,ASP.NET MVC的filter在调用执行前后会被触发。 先看下当Control 里面的action 被调用时的利用继承,自定义类log的效果图:

要实现上面的效果,现自定义一个类LogMessageAttribute,LogMessageAttribute继承接口IActionFilter ,IResultFilter,也可以选择性的继承重写类FilterAttribute。

IActionFilter interface 定义为:

public interface IActionFilter  {  // Methods  void OnActionExecuted(ActionExecutedContext filterContext);  void OnActionExecuting(ActionExecutingContext filterContext);  } 

OnActionExecuting :在Controller 里面的action method 调用之前运行

OnActionExecuted:在Controller 里面的action method 调用之后运行,但是在IResultFilter接口的OnResultExecuting方法执行之前

IResultFilter interface定义为:

public interface IResultFilter  {  // Methods  void OnResultExecuted(ResultExecutedContext filterContext);  void OnResultExecuting(ResultExecutingContext filterContext);  } 

OnResultExecuting:在Controller 里面的action method调用处理玩前执行.

OnResultExecuted:在Controller 里面的action method调用处理玩后执行.

接下来是重头戏:LogMessageAttribute自定义类

[AttributeUsage(AttributeTargets.Class |AttributeTargets.Method ,Inherited=true ,AllowMultiple=true )]  public class LogMessageAttribute:FilterAttribute,IActionFilter,IResultFilter   {   ///  summary  ///  param name= LogName  日志文件路径 /para  ///  /summary  public string LogName { get; set; }    ///  summary  /// 记录时间,系统版本,当前线程ID 等记录  ///  /summary  ///  param name= controller /param  ///  param name= action /param  ///  param name= message /param  public void LogMessage(string controller, string action, string message)  {  if (!string.IsNullOrEmpty(LogName))  {    TextWriter writer = new StreamWriter(LogName, true);  writer.WriteLine( ################# Begin ################# );  writer.WriteLine( Time:[{0}] ,DateTime.Now.ToString( yyyy-MM-dd- hh:mm:ss ));  writer.WriteLine( Controller:{0} ,controller);  writer.WriteLine( Action:{0} ,action);  writer.WriteLine( Message:{0} ,message);  writer.WriteLine( Operating System version is:{0} ,System.Environment.OSVersion.Version.ToString());  writer.WriteLine( Current Thread ID is:{0} ,AppDomain.GetCurrentThreadId());  writer.WriteLine( ############### Over ############### );  writer.Close();   }  }  public void OnActionExecuting(ActionExecutingContext filterContext)  {  LogMessage(filterContext.RouteData.Values[ controller ].ToString(),  filterContext.RouteData.Values[ action ].ToString(),   Action exeuting... );  }  public void OnActionExecuted(ActionExecutedContext filterContext)  {  LogMessage(filterContext.RouteData.Values[ controller ].ToString(),  filterContext.RouteData.Values[ action ].ToString(),   Action executed. );  }  public void OnResultExecuting(ResultExecutingContext filterContext)  {  LogMessage(filterContext.RouteData.Values[ controller ].ToString(),  filterContext.RouteData.Values[ action ].ToString(),   Result executing... );  }  public void OnResultExecuted(ResultExecutedContext filterContext)  {  LogMessage(filterContext.RouteData.Values[ controller ].ToString(),  filterContext.RouteData.Values[ action ].ToString(),   Result executed );  }  } 

自定义好LogMessageAttribute类,应用到Controller或者action的属性。在Controller 正在执行,或者呈现一个View,一个HTTP请求数据时,就会在日志文件记录一些日志.

在项目的Controller里面应用自定义的属性

[Logging(LogName = @ D:\Project\Project\MVCProject\sky.ExtendMVCFramework\sky.ExtendMVCFramework\Log.log )]  public ActionResult DesplayEmployee()  {  ViewData[ Message ] =  Our employees welcome you to our site! ;  List Employee  employees = new List Employee  {  new Employee {  FirstName= sky ,  LastName= yang ,  Email =  weflytotti@163.com ,  Department = Development  },  new Employee {  FirstName= sky ,  LastName= yang ,  Email =  weflytotti@163.com ,  Department = Development  }  };  return View(employees);  } 

运行程序,正如文章开始所看到的截图!

总结:自定义ASP.NET MVC 的过滤属性实现自己想要的功能只需要继承IActionFilter ,IResultFilter。

Copyright© 2006-2015 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 渝ICP备12000264号 法律顾问:元炳律师事务所
客服软件
live chat