您的位置:首页 > 编程语言 > ASP

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

2017-09-14 17:01 573 查看
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类当做定义。记录一下!

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: