MVC4 自定义错误页面(三)

一、概述

MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面;

二、使用步骤:

1、配置WebConfig文件,在System.Web节点下加上

<customErrors mode="On"  defaultRedirect="~/Shared/Error" />

翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现在MVC4中这种说法并不准,在MVC中,有一套默认的机制(这部分代码被微软封装,无法阅读),该机制能够把错误信息通过HandleError属性指向Shared/Error页面,也就是说配置System.Web节点,可以省略defaultRedirect

customErrors mode="On"/>   

2、Global文件,添加HandleEffor属性

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
       filters.Add(new HandleErrorAttribute(),1);
 }

在Global定义之后,也就是全局定义,其他Action和Control都不需要定义,默认使用HandleError控制属性;

这样就可以使用MVC4中系统默认的Error页面;

三、自定义错误页面

  有些时候,我们想使用自定义的错误页面,该怎么处理那,翻页其他大牛写的博客,看到有这种方式,自定义属性Class继承FileterAttribute,重写OnException方法,代码如下

public class BaseHandleErrorAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled == true)
            {
                HttpException httpExce = filterContext.Exception as HttpException;
                if (httpExce != null && httpExce.GetHttpCode() != 500)//为什么要特别强调500 因为MVC处理HttpException的时候,如果为500 则会自动将其ExceptionHandled设置为true,那么我们就无法捕获异常
                {
                    return;
                }
            }
            Exception exception = filterContext.Exception;
            if (exception != null)
            {
                HttpException httpException = exception as HttpException;
                if (httpException != null)
                {
                    //网络错误
                    filterContext.Controller.ViewBag.UrlRefer = filterContext.HttpContext.Request.UrlReferrer;
                    int DataEroorCode = httpException.GetHttpCode();
                    if (DataEroorCode == 404)
                    {
                        filterContext.HttpContext.Response.Redirect("~/SysError/404");
                    }
                    else if (DataEroorCode == 500)
                    {
                        filterContext.HttpContext.Response.Redirect("~/SysError/500");
                    }
                    else
                        filterContext.HttpContext.Response.Redirect("~/SysError/" + DataEroorCode);

                    //写入日志 记录
                    filterContext.ExceptionHandled = true;//设置异常已经处理
                }
                else
                {
                    //编程或者系统错误,不处理,留给HandError处理
                }
            }
        }
    }

将该属性注册到全局Global中,定义铺货异常等级

      public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new BaseHandleErrorAttribute(),0);

            filters.Add(new HandleErrorAttribute(),1);

        }

当然我们也可以不使用MVC框架自带的Error页面,定义一个Error404,如何使用这个页面那 ,起始也挺简单的,代码如下

      public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new BaseHandleErrorAttribute(),0);

            filters.Add(new HandleErrorAttribute(View="Error404"),1);

        }

四、遇到问题总结

1、遇到重定向,URL指向aspxerrorpath,如:

http://local:8090/error/error.htm?aspxerrorpath=/cmt/p/3789549.html

出现这个问题的主要原因:

1>、Global没有添加

filters.Add(new HandleErrorAttribute(View="Error404"))

2>、Shared目录没有Error页面;

3>、如果存在Error页面,但是页面是用了布局Layout,组成的Error页面存在错误,比如ModeView数据不对等,需要详查;

2、自定义Error的其他方式

翻页其他大牛写的文章时候,返现也可以使用Gloal中的Application_Error事件方法处理,比如博主@dudu写的异常处理方式;

代码粘贴如下:

protected void Application_Error(Object sender, EventArgs e)
{
    var lastError = Server.GetLastError();
    if (lastError != null)
    {
        var httpError = lastError as HttpException;
        if (httpError != null)
        {
            //ASP.NET的400与404错误不记录日志,并都以自定义404页面响应
            var httpCode = httpError.GetHttpCode();
            if (httpCode == 400 || httpCode == 404)
            {
                Response.StatusCode = 404;//在IIS中配置自定义404页面
                Server.ClearError();
                return;
            }
            Logger.Default.Error("Application_Error_" + httpCode, httpError);
        }

        //对于路径错误不记录日志,并都以自定义404页面响应
        if (lastError.TargetSite.ReflectedType == typeof(System.IO.Path))
        {
            Response.StatusCode = 404;
            Server.ClearError();
            return;
        }

        Logger.Default.Error("Application_Error", lastError);
        Response.StatusCode = 500;
        Server.ClearError();
    }
}

实现样式多样,只要实现功能就是最好;

时间: 2024-12-25 09:48:58

MVC4 自定义错误页面(三)的相关文章

MVC4 自定义错误页面(转)

一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.Web节点下加上 <customErrors mode="On"  defaultRedirect="~/Shared/Error" /> 翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现

ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但这对于用户是非常可怕的,因为用户不知道发生了什么,也无法了解黄页给出的内容.甚至,如果我们遇到一些不友好的人,他们会拿这些内容大做文章,对我们网站产生威胁. 那我们如何在程序异常.系统崩溃时,不会出现黄页,并且还可以给出一些更加友好的提示呢?甚至在我们需要的时候,可以收集这些异常信息,并加以分析,能

[转载]针对IIS7以上的ASP.NET网站自定义错误页面与异常日志总结

针对IIS7以上的ASP.NET网站自定义错误页面与异常日志总结 汪宇杰 2014-1-11 星期六 02:31 455 Reads 1 Comments 自定义错误页面和异常记录是个很古老的话题了,但依旧可以让人爆到现在.在我做了无数次试验并总结经验和原则后,写下本文,已警后人. 本文的范围和限制 本文仅仅适用于部署在IIS7或以上版本中的ASP.NET 4.0集成模式应用程序.IIS7以上的意思是Windows Server 2008以上服务器适用.我已在WS2012R2,IIS8上测过.

ASP.NET网站中设置404自定义错误页面

在用ASP.NET WebForm开发一个网站时,需要自定义404错误页面. 做法是这样的 在网站根目录下建立了一个404.html的错误页面,然后在Global.asax文件中,加入如下代码: <%@ Application Language="C#" %> <script runat="server"> void Application_Error(object sender, EventArgs e) { Response.Status

Spring Boot自定义错误页面,Whitelabel Error Page处理方式

我已经是Spring Framework框架的忠实粉丝.对于企业软件开发者来说它提供了对常见问题的通用解决方案,包括那些你在未来开发中没有意识到的问题.但是,它构建的J2EE项目变得比较臃肿,需要被一种新的解决方案替代. 我最大的抱怨就是最开始使用spring Framework构建项目十分缓慢和复杂,比如构建一个包含JPA的MVC应用.为改变这种情况,Spring Boot应运而生了. Spring Boot以一种新的微服务的方式来替代以Spring Framework构建项目的传统方式,我已

MVC自定义错误页面

MVC异常处理主要有三种方案:1.基于HandleErrorAttribute重写OnException方法:2.基于Global.apsx添加Application_Error方法:3.直接在Web.Config中配置.现基于上述思路,测试了下面三种自定义错误页面的处理方法(主要侧重于显示异常信息,便于快速找到代码中的异常来源),以便后续查阅.不足之处,还请指教! 1.直接在web.config的<system.web>节点下加入<customErrors mode="On&

.net自定义错误页面实现升级篇

问题描述: 在上一篇博文 ".net自定义错误页面实现" 中已经介绍了在.net中如何实现自定义错误页面实现(有需要者可以去上一篇博文了解),单纯按照上一篇博文那样设置,能够实现所有请求的异常自定义跳转,但是这样又会产生一个问题:当通过ajax提交请求获取接口提交请求,如果出现未处理的异常也会被重定向到自定义错误页面. 针对ajax请求或者接口请求,这样返回一个重定向页面,用户体验显然不是太友好,针对这个问题,下面简单总结一下我自己的想法和解决方案,当然不一定科学和合理,所以也希望有大

翻译:ASP.NETMVC自定义错误页面真的简单吗?

如果你在设置asp.net mvc自定义错误页面时遇到问题,这并不止你一个人.惊讶之余你的做法是正确的,没有起到作用的原因是其一部分错误是由asp.net管道处理的,另一部分是由iis直接处理. 通常情况 (我期望是这种情况,在一些其他框架/服务器上) 我们只需要在一个地方配置自定义错误页就可以了,无论怎么哪儿引发的错误.就像这样︰ <customErrors mode="On"> <error code="404" path="404.

ASP.NET Core中显示自定义错误页面

在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app.UseStatusCodePages(); ,500错误时依然是一片空白(不知为何对500错误不起作用),404错误时有所改观,页面会显示下面的文字: Status Code: 404; Not Found 如果我们想不管500还是404错误都显示友好的自定义错误页面,该如何实现呢?请看下面的分解.