ASP.NET MVC过滤器的使用

一.过滤器的理解

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<string, object>() { { "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)]

从小到大的执行,不能倒序进行排序

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值