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

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

51CTO向您推荐《ASP.NET MVC框架视频教程》,希望通过本教程能让大家更好的理解ASP.NET MVC。

现在的企业级开发项目,特别是网站一般都会用到log功能,想想大部分会用Enterprise Logging Application Block 的功能 或者自己写一个组件,记录系统日志事件,更好的跟踪了解系统运行情况, 现用ASP.NET MVC 的过滤属性实现log功能!

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

   LOG的效果图 

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

IActionFilter interface 定义为:

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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

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

IResultFilter interface定义为:

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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 { getset; }  
 
   
 
       /// <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");  
        }  
    }  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.

自定义好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);  
     }  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

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

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

原文标题:ASP.NET MVC 自定义过滤属性实现Enterprise的log功能

链接:http://www.cnblogs.com/skyyang/archive/2010/04/30/1724580.html

【编辑推荐】

  1. MVC架构模式为什么这样“红”?
  2. 专访微软MVP衣明志:走进ASP.NET MVC 2框架开发
  3. 浅谈ASP.NET MVC中TempData的实现机制
  4. ASP.NET MVC中使用View Model分离领域模型
责任编辑:彭凡 来源: 博客园
相关推荐

2009-08-04 13:35:16

ASP.NET自定义样

2009-08-06 17:13:56

ASP.NET自定义控

2009-11-24 15:11:21

ASP.NET MVC

2009-07-22 15:27:39

ASP.NET MVC自定义路由

2009-07-22 16:02:39

ASP.NET MVCPagedList

2009-08-10 14:16:59

ASP.NET自定义控

2009-07-28 09:32:41

ASP.NET自定义控

2009-08-12 14:38:05

ASP.NET Dat

2011-04-19 10:33:16

ASP.NET自定义控

2009-07-31 10:23:09

ASP.NET源码DateTimePic

2009-08-06 17:52:45

ASP.NET控件开发自定义控件

2009-07-20 15:44:32

ASP.NET MVC

2009-08-10 16:58:45

ASP.NET安装部署

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-07-28 14:47:18

ASP.NET MVC

2009-08-05 17:58:53

自定义集合ASP.NET 2.0

2009-08-01 12:00:15

ASP.NET服务器自ASP.NET服务器ASP.NET

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发
点赞
收藏

51CTO技术栈公众号