MVC 异常过滤器

本文实现对MVC异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法。

第一步:写一个自己的异常过滤器,让它继承HandleErrorAttribute类 然后重写OnException()这个方法  (注:HandleErrorAttribute 类已经继承了FilterAttribute, IExceptionFilter这两个接口,并实现了它们,所以这我们只要继承HandleErrorAttribute就可以了)

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

namespace Itcast.CMS.WebApp.Controllers.Filters
{
    public class MyExceptionFilterAttribute : HandleErrorAttribute
    {

        Itcast.CMS.Common.LogHelper log = new Common.LogHelper();
        public override void OnException(ExceptionContext filterContext)
        {

            //获取或设置一个值,该值指示是否已处理异常。如果已处理异常,则为 true;否则为 false。
            if (filterContext.ExceptionHandled==true)
            {
                HttpException httpException = filterContext.Exception as HttpException;
                //为什么要特别强调500 因为MVC处理HttpException的时候,如果为500 则会自动
                //将其ExceptionHandled设置为true,那么我们就无法捕获异常
                if (httpException.GetHttpCode() == 500)
                {
                    return;
                }
            }
            //创建一个HttpException对象,使用filterContext.Exception来对它初始化(其实就是将filterContext.Exception转换成HttpException类型)
            HttpException httpExce = new HttpException(null, filterContext.Exception);
            //HttpException httpExce = filterContext.Exception as HttpException;

            if (httpExce != null)
            {
                if (httpExce.GetHttpCode() == 404)
                {
                    HttpContext.Current.Response.Redirect("/Error/NotFound");//跳转到404错误页面
                }
                else if (httpExce.GetHttpCode() == 500)
                {
                    //也可以这样写
                    filterContext.HttpContext.Response.Redirect("/Error/ServerError");//跳转到500服务器错误页面
                }
            }

            //调用log4net来记录日记
            log.Error("错误:" + filterContext.Exception.Message, filterContext.Exception);

            filterContext.ExceptionHandled = true;    //将异常设置为已处理     

        }

    }
}

第二步:将自己刚刚写的过异常滤器注册到MVC的全局过滤器中去。只要到App_Start这个文件夹下的FilterConfig.cs文件中注册一下就可以,

将默认的 filters.Add(new HandleErrorAttribute()); 这段代码 替换为filters.Add(new MyExceptionFilterAttribute()); 具体代码如下

using Itcast.CMS.WebApp.Controllers.Filters;
using System.Web;
using System.Web.Mvc;

namespace Itcast.CMS.WebApp
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new MyExceptionFilterAttribute());
        }
    }
}

做好以上两步,当MVC中有异常的时候,就会自动跳转到自己的过滤器中进行处理了。(注:不需要在类,或者方法前面加[MyExceptionController])只要做好前面两步就可以了

其实有的时候报404错误,也就是在路由阶段就没有通过,也就是没有到达控制器,所以无法进入到我们的过滤器。(去网上查了一下,都说404不是属于一个异常,仅仅是路径错误,这时候只要去Web.cofig配置文件中,配置一下,当出现404错误的时候,就跳转到我们自定义的错误页去)

<?xml version="1.0" encoding="utf-8"?>

<configuration>
  <system.web>

    <!--定义友好的错误,出错默认导向到 我们定义好的友好错误页面 -->

    <!--mode属性:mode="On"的时候就表示对所以访问者都显示定制错误页;mode="Off"就表示关闭定制的错误页,页面错误的时候将本地和远程用户都会看到详细的错误信息;mode="RemoteOnly"就表示本地用户将看到详细错误信息(这里的本地的意思即:你直接登陆网站服务器上),而远程用户将会看到程序员定制的错误页。所以一般情况下我们都建议将mode属性设为RemoteOnly-->

    <!--RedirectMode 属性:获取或设置一个值,该值指示在将用户重定向到自定义错误页面时,是否应更改请求的 URL。默认值为 ResponseRedirect。如果 RedirectMode 属性设置为 ResponseRedirect,则将用户重定向到该错误页面,并且原始 URL 更改为该错误页面的 URL。如果 RedirectMode 属性设置为 ResponseRewrite,则将用户定向到错误页面,并且不更改浏览器中的原始 URL。【ResponseRedirect其实就是Response.Redirect;而ResponseRewrite其实就是Server.Transfer】 -->

    <!--defaultRedirect属性:应用程序在发生错误时重定向到的默认URL-->
    <!--<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/Error/notfound">-->

    <!--在它下面还可以分的很详细,可以针对一些错误码来指向我们针对这些错误码而定制的页面-->
    <!--<error statusCode="403" redirect="/Error/403" />-->
    <!--<error statusCode="404" redirect="/Error/404" />-->
    <!--</customErrors>-->

    <customErrors mode="On" >
       <error statusCode="404" redirect="/Error/notfound"/><!--出现404错误的时候跳转到Error控制器下的notfound方法-->
    </customErrors>

  </system.web>

</configuration>
时间: 2024-11-16 18:04:15

MVC 异常过滤器的相关文章

MVC异常过滤器

MVC过滤器 一般的过滤器执行顺序 IAuthorizationFilter->OnAuthorization(授权) IActionFilter          ->OnActionExecuting(行为) Action IActionFilter          ->OnActionExecuted(行为) IResultFilter          ->OnResultExecuting(结果) View IResultFilter          ->OnR

MVC异常过滤器 (错误页)

控制器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVC过滤器.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index(string id, string nam

MVC与WebApi中的异常过滤器

一.MVC的异常过滤器 1.自定义MVC异常过滤器 创建一个类,继承HandleErrorAttribute即可,如果不需要作为特性使用直接实现IExceptionFilter接口即可, 注意,该接口在System.Web.Mvc 命名空间下 /// <summary> /// 自定义的MVC异常过滤器 /// 可以在Controller或Action上单独使用,也可直接注册为全局过滤器 /// </summary> publicclassMVCExceptionFilterAtt

MVC 全局异常过滤器HandleErrorAttribute

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc; namespace 过滤器.Filtes{ /// <summary> /// 全局异常过滤器/// </summary> public class MyHandleErrorAttribute:HandleErrorAttribute { public override voi

学一学MVC的过滤器--异常处理

学习MVC不久,看到公司的项目里有日志记录功能,出于自己的原因一直没有看看是如何实现的,后来看了个学习视频和一些博文,才发现采用MVC里的过滤器 Filter 可以很容易实现,比较常见也很容易的做法就是继承  IActionFilter,IExceptionFilter 接口,然后实现里面的方法即可. 下面看一下代码,这是公司项目的一段代码,主要是将项目中出现的异常记录在 每天的txt日志文件里.当然实现日志的方法有很多种,这个只是其中一种,如果出现了IO错误,这种方法就不好说啦.  publi

MVC4 异常过滤器

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcRazor.Models { //异常过滤器 public class MyExceptionFilterAttribute:HandleErrorAttribute { public override void OnException(ExceptionCo

ASP.NET MVC : Action过滤器(Filtering)

http://www.cnblogs.com/QLeelulu/archive/2008/03/21/1117092.html ASP.NET MVC : Action过滤器(Filtering) 相关文章: ASP.NET MVC URL Routing 学习 AP.NET MVC : 控制器 和 控制器Actions ASP.NET MVC 学习: 视图 有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器

asp.net mvc之过滤器

先看一段实例 public class Log : FilterAttribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext filterContext) { Console.WriteLine("log-after"); } public void OnActionExecuting(ActionExecutingContext filterContext) { Console.WriteL

MVC 异常过滤

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using cpf360.Common; using cpf360.DTO; namespace hanli_project.Filters { public class HanliExceptionAttribute : IExceptionFilter { void IExcept