使用Common.Logging 1.2实现Logging(二)ASP.NET MVC、Filter

ASP.NET MVC Filter

 action filter作为一个可以应用到controller action(或者是整个controller)上的属性(Attribute),改变action执行的行为。

Asp.Net MVC提供了以下几种默认的Filter

Filter Type

实现接口

执行时间

Default Implementation

Authorization filter

IAuthorizationFilter

在所有FilterAction执行之前执行

AuthorizeAttribute

Action filter

IActionFilter

分别在Action执行之前和之后执行。

ActionFilterAttribute

Result filter

IResultFilter

分别在Action Result执行之后和之前

ResultFilterAttribute

Exception filter

IExceptionFilter

只有在filter,

或者 action method, 或者 action result 抛出一个异常时候执行

 

HandleErrorAttribute

 你同时可以创建自己的action filter,比如说要实现一个自定义的验证系统,那么可能需要创建一个自定义的action filter,或者说当你需要改变controller action返回的view data的时候,也可以通过创建自定义action filter实现。

 

Action Filter

为了让用户更简单的创建一个自定义action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter接口,并且继承了Filter类。

这里的术语并不完全一致,从技术上说,这个类继承ActionFitlerAttribute,并且同时实现了action filter和result filter接口,但是从宽松意义上说,在ASP.NET MVC Framework中,任何实现filter的类型都是action filter。

ActionFilterAttribute类有以下的方法可以重写:

•OnActionExecuting – 在controller action执行之前调用
•OnActionExecuted – 在controller action执行之后调用
•OnResultExecuting – 在controller action result执行之前调用
•OnResultExecuted – 在controller action result执行之后调用

Authorization filter

Result filter

Exception filter


 

 

MVCQuick的ExceptionFilter

使用“使用Common.Logging 1.2实现Logging(一)”的Logging框架

实现代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCQuick.Framework.Logging;

namespace MVCQuick.Framework.Mvc
{
public class HandleErrorLogAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
Logger logger = Logger.GetLogger(filterContext.Controller.GetType());

logger.Error(filterContext.Exception);

filterContext.Controller.ViewData["Error"] = filterContext.Exception;
filterContext.Result = new ViewResult()
{
ViewName = "Error",
ViewData = filterContext.Controller.ViewData,
};

filterContext.ExceptionHandled = true;
}

}
}

使用方法

在Global.asax.cs类Application_Start()中初始化Logging

Logger.ConfigureLog4Net(HttpContext.Current.Server.MapPath("~/log"), LogLevel.Info, LogLevel.Info);

替换HandleErrorAttributeHandleErrorLogAttribute

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorLogAttribute());
}

 

源代码下载:http://mvcquick.codeplex.com/  

posted @ 2011-10-17 14:00  GuYoung  阅读(1664)  评论(0编辑  收藏  举报