一.过滤器的理解
1.ASP.NET MVC中继承自FilterAttributeAttribute的类统称为过滤器
2.Authorize HandlerError OutputCache这些类都直接或者间接的继承自FilterAttribute
二.过滤器常见的分类
【1】授权[Authorize]
【2】错误处理[HandlerError]
【3】缓存[OutPutCache]
【4】自定义过滤器
三.过滤器常见的接口
【1】IActionFilter 在执行动作方法后调用 void OnActionExecuted(ActionExecutedContext filtercontext)
在执行动作方法前调用 void OnActionExecuting(ActionExecutingContext filtercontext)
【2】IResultFilter 在操作结果执行之后调用 void OnResultExecuted(ResultExecutedContext filtercontext)
在操作结果执行之前调用 void OnResultExecutingContext(ResultExecuttingContext filterContext)
【3】IExceptionFilter 在发生异常时调用 void OnException(ExceptionContext filterContext)
【4】IAuthorizationFilter 在需要授权时调用 void OnAuthorization(AuthorizationContext filterContext)
四.自定义一个错误日志过滤器 动作方法过滤器
使用log4net进行日志记录,配置文件自己配置
public class LogAndActionFilter:FilterAttribute,IActionFilter,IExceptionFilter
{
private static ILog log;
static LogAndActionFilter()
{
XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile));
log = LogManager.GetLogger(typeof(AppLog));
}
public void OnException(ExceptionContext filterContext)
{
StringBuilder str=new StringBuilder();
str.Append(string.Format("时间:{0}=====>",DateTime.Now.ToString()));
str.Append(string.Format("发生在:{0}控制器下的:{1}动作方法下,异常信息是:{2}",filterContext.RouteData.Value["Controller"],filterContext.RouteData.Value["Action"],filterContext.Exception.Message));
log.Info=str;
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
string name=HttpContext.Current.Session["User"];
if(name==null)
{
filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new Dictionary() { { "controller", "Home" }, { "action", "Index" } }), true);
return ;
}
}
}
或者使用文件流的方式进行日志记录:
public void OnException(ExceptionContext filterContext)
{
string path=filterContext.HttpContext.Server.MapPath(@"~\log.txt");
using(StreamWrite sw=File.AppendText(path))
{
sw.writeLine("====开始记录错误信息====");
sw.WriteLine("时间:{0}",DateTime.Now.ToString());
sw.WriteLine("在{0}控制下的{1}动作方法",filterContex.RouteData.Value["Controller"],filterContext.RouteData.Values["Action"]));
sw.WriteLine("错误信息是:{0}",filterContext.Exception.Message);
sw.WriteLine("========结束记录错误信息==========");
}
}
五.全局注册过滤器
public class FilterConfig
{
public static void RegisterGlobalFilters(GloabalFiterCollection fiters)
{
filters.Add(new HandlerErrorAttribute())
}
}
六.过滤器的优先级问题
使用Order
[LoginFilter(Order=1)]
[LoginFilter(Order=2)]
[LoginFilter(Order=3)]
从小到大的执行,不能倒序进行排序