使用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 |
在所有Filter和Action执行之前执行 |
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());
}