利用ASP.NET MVC Filter 处理网站异常

1,Filter(筛选器)是基于AOP(面向方面编程)的设计,他的好处什么的就不是本文要说的,如果要了解关于filter的相关知识请参照,大神说的够清楚了:http://www.cnblogs.com/willick/p/3331520.html

这里主要记录一下我自己的利用ASP.NET MVC Filter 处理网站异常过程:

 

2,首先添加 一个自定义的filter类:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Web.Infrastructure
{
    //错误filter
    //所有的action出现了错误,都会跳到这个类,然后记录日志
    //
    public class ErrorExceptionAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.ExceptionHandled)
            {
                string ControllerName = string.Format("{0}Controller", filterContext.RouteData.Values["controller"] as string);
                string ActionName = filterContext.RouteData.Values["action"] as string;


                NameValueCollection gets = filterContext.HttpContext.Request.QueryString;
                List<string> listget = new List<string>();
                foreach (string key in gets)
                {
                    listget.Add(string.Format("{0}={1}", key, gets[key]));
                }

                NameValueCollection posts = filterContext.HttpContext.Request.Form;

                List<string> listpost = new List<string>();
                if (filterContext.HttpContext.Request.Files.Count <= 0)
                {
                    foreach (string key in posts)
                    {
                        listpost.Add(string.Format("{0}={1}", key, posts[key]));
                    }
                }
                ControllerName = ControllerName.Replace("Controller", "");
                string ErrorMsg = string.Format("错误url: {0}/{1}?{2} ||,post参数:{3} || 错误msg:{4}",
                                  ControllerName, ActionName, string.Join("&", listget.ToArray()), string.Join("&", listpost.ToArray()),filterContext.Exception.Message.ToString());

                Common.CommonMethed.WriteLog(ErrorMsg);//用Log4net记录日志



               // filterContext.Result = new RedirectResult("404.html"); //这里不进行跳转,直接webconfig设置404页面,因为404页面在webform项目上
                filterContext.ExceptionHandled = true;



            }
        }
    }
}

3,然后将这个filter注册为全局的filter,这样你网站上所有的控制器下的所有action出错都可以跳到自定义的那个filter类进行处理,就不用为每个action添加attribute。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Web.Infrastructure;

namespace Web.App_Start
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new ErrorExceptionAttribute());//注册为全局filter
        }
    } 
}
4,FilterConfig 在App_Start文件夹中,如果发现App_Start文件夹下无FilterConfig.cs类,则需自己手动创建,然后在Global文件下的下面方法中注册FilterConfig.cs类

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            //System.Data.Entity.Database.SetInitializer<Service.NewHouseContext_HB>(null);
            AtuofacConfig.AutoFacInit();
             
             
        }

 

5,故意在某个action当中抛出一个异常,可以看看效果:

 

这里我是将错误记录在了txt,当然也可以其他方式收集错误。

经过测试,除了action里面的错误能够捕捉到之外,view视图里面的报错也能够跳到自定义的filter类里面去处理。

另外,当发生错误时,除了记日子,也可以跳转到一个404友好页面,这个可以在自定义的filter类当做定义。

记录一下!







posted @ 2017-09-14 17:01  VisibleIsFalse  阅读(231)  评论(0编辑  收藏  举报