利用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类当做定义。
记录一下!