MVC3学习 八 Action和result过滤器及日志处理

在项目中很多地方需要用到面向切面的思想,比如说身份验证、日志功能这些。

过滤器可以理解为在执行某个功能时,额外执行的一段代码,在MVC中有Action和result过滤器,

分别都是在执行前和执行后进行过滤的,具体代码如下:

public class MyActionFilterAttribute:ActionFilterAttribute
    {
        public string Name { get; set; }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            HttpContext.Current.Response.Write("<p>Action 开始执行" + Name + "</p>");
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            HttpContext.Current.Response.Write("<p>Action 执行完成" + Name + "</p>");
        }
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);
            HttpContext.Current.Response.Write("<p>Result 开始执行" + Name + "</p>");
        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            base.OnResultExecuted(filterContext);
            HttpContext.Current.Response.Write("<p>Result 执行完成" + Name + "</p>");
        }
    }
    [MyActionFilter(Name="ActionFilterTest")]
        public ActionResult ActionFilterTest()
        {
            throw new Exception("demo");
            return Content("页面加载完成");
        }

其中注意,过滤器特性的位置还可以放到controller的上面,代表这个控制器下所有的Action方法都执行这个过滤器,也可以放到Global.asax文件中,代表整个项目都执行这个过滤器。

过滤器是有执行优先级的,最靠近Action的过滤器才会执行。

那么如果想一个Action执行多个过滤器,就需要再添加一个新的特性。

[AttributeUsage(AttributeTargets.All,AllowMultiple=true)]
public class HomeController : Controller

其中AllowMultiple=true属性是允许多个特性一起执行,执行的时候顺序会是先global中的过滤器,以此类推,最后正着进去,反着出来。

异常过滤器

异常过滤器:当项目中出现异常时,就会自动执行异常过滤器中的代码。先添加一个类。

public class MyExceptonFilterAttribute:HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
base.OnException(filterContext); HttpContext.Current.Response.Redirect("/Home/Index"); } }

然后在global页面中添加异常的过滤器。

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
           // filters.Add(new HandleErrorAttribute());  //换自己的
            filters.Add(new MyExceptonFilterAttribute());
        }

这里做的是跳转至错误页面,其实应该记录日志文件,思路大概是使用线程访问文件,然后记录,但是以后用户会非常多,

所以就需要考虑到多线程操作这个文件,用线程锁的方式记录,但是这样会很影响性能。

所以应该考虑使用使用内存列队来提高性能 Redis,日志信息直接放进内存中,然后在用一个线程读取并写入日志文件,这样就不会让用户等待。

在项目中,一般使用log4net组件,进行记录日志。

总结:过滤器大概的流程为继承ActionFilterAttribute和HandleErrorAttribute类,然后重写里面的方法。

最后为需要过滤的Action加上特性就可以了。

    

原文地址:https://www.cnblogs.com/y8932809/p/4408899.html