要在ASP.NET中处理好自定义错误(Custom Errors)首先要抛弃使用web.config\customErrors。

<customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm">
<error statusCode="404" redirect="/error/404.htm" />
</customErrors>

使用web.config\customErrors最大的一个缺点是在显示自定义错误页面时会重定向:

http://www.cnblogs.com/error/error.htm?aspxerrorpath=/cmt/p/3789549.html

这会带来2个麻烦:

1. 会造成用户反馈问题时提供的是重定向后的URL。

2. 会造成用户无法通过刷新浏览器进行重试,或者问题解决后通过刷新浏览器恢复正常。

我们目前想到的最佳处理方式是在Global.asax.cs的Application_Error中进行处理。

代码如下:

protected void Application_Error(Object sender, EventArgs e)
{
Exception lastError = Server.GetLastError(); if (lastError != null)
{
if (lastError is HttpException)
{
if (((HttpException)lastError).ErrorCode == )
{
Response.StatusCode = ;
Server.ClearError();
return;
}
}
CNBlogs.Infrastructure.Logging.Logger.Default.Error("Application_Error", lastError);
Response.StatusCode = ;
Server.ClearError();
}
}

由于我们在IIS中指定了404/500错误的自定义错误页面,所以这里只需要返回状态码(需要IIS 7.0以上)。

这样处理后,还可以方便地在显示自定义错误之前记录到log4net日志。

另外需要注意的是一定要Server.ClearError(),不然ASP.NET会根据web.config\customErrors进行继续处理(代码中的自定义错误处理就会失效),错误信息也会被记录到Windows日志(既然我们已经记录到了log4net日志,就没必要再记录到Windows日志)。

你也许会问,几行代码就能解决的如此简单的问题,值得兴师动众写篇博客还要发在首页?

值!因为之前我们没有认真对待这个地方的问题,多次为此付出了代价。也许园子里还有人没有注意这个地方的问题。

踩自己的坑,写自己的博客,然后让别人无坑可踩,我想这也是写博客的一个价值体现吧。

【更新】

根据@NatureSexy的建议,改进了代码:

protected void Application_Error(Object sender, EventArgs e)
{
var lastError = Server.GetLastError(); if (lastError != null)
{
var httpError = lastError as HttpException;
if (httpError != null && httpError.ErrorCode == )
{
Response.StatusCode = ;
Server.ClearError();
return;
} CNBlogs.Infrastructure.Logging.Logger.Default.Error("Application_Error", lastError);
Response.StatusCode = ;
Server.ClearError();
}
}

【2014年12月27日更新】

Application_Error代码更新,之前的代码中没有处理ASP.NET的400错误情况。

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 == || httpCode == )
{
Response.StatusCode = ;//在IIS中配置自定义404页面
Server.ClearError();
return;
}
Logger.Default.Error("Application_Error_" + httpCode, httpError);
} //对于路径错误不记录日志,并都以自定义404页面响应
if (lastError.TargetSite.ReflectedType == typeof(System.IO.Path))
{
Response.StatusCode = ;
Server.ClearError();
return;
} Logger.Default.Error("Application_Error", lastError);
Response.StatusCode = ;
Server.ClearError();
}
}

注:如果用的是MVC,需要注释下面的代码:

//filters.Add(new HandleErrorAttribute());

ASP.NET中处理自定义错误的最佳方式的更多相关文章

  1. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  2. python中逐行读取文件的最佳方式_Drupal_新浪博客

    python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式    (2010-08-18 15:59:28)    转载▼    标签:    python   ...

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

    在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...

  4. ASP.NET MVC下自定义错误页和展示错误页的几种方式

    在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...

  5. redirect的错误用法asp.net怎么使用自定义错误

    工作了几年,写过程序也运营过网站,自定义错误也很熟悉了,最近再做项目发现有同事写了这样的代码 if (action != null) { id = Request.QueryString[" ...

  6. 在ASP.NET中引用自定义提示框

    在html网页中自定义提示框 正文: 在一般的B/S架构中项目,与用户的交互信息是非常重要的.在一般的情况下,设计人员都在把用户信息呈现在html中,用div和span去弹出相关信息.对于一般的情况而 ...

  7. ASP.Net中页面传值的几种方式

    开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...

  8. ASP.NET中处理异常的几种方式

    1.程序中使用try catch 对于预知会发生异常的代码段使用try catch主动捕获异常,适用于提示给用户或跳转到错误页面,或者通过其它方式处理异常(日志.通知等). int i = 10; i ...

  9. ASP.NET中指定自定义HTTP响应标头

    新建一个类HideServerHeaderHelper,继承 IHttpModule,然后重写 OnPreSendRequestHeaders,Dispose,Init方法,如下代码所示 using ...

随机推荐

  1. 【原+转】用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: ./configu ...

  2. 在SQL2008中使用XML应对不确定结构的参数

    目的:统一接口,当数据结构发生变化时,前后端业务接口不发生变化,由业务具体解析结构. 规则:确定的接口用参数表(多行提交),不确定的参数用XML   DECLARE @r TABLE     (    ...

  3. css简介及相关概念

    一.简介: css全称为级联样式表(Cascading Style Sheet),通常又称为风格样式表(Style Sheet),是用来进行网页风格设计的.  css优点: 内容与表现分离 表现的统一 ...

  4. linux 学习随笔-group和user管理

    1:/etc/passwd 打开该文件,可以看到每一行内容被分割成了7个字段比如:root:x:0:0:root:/root:/bin/bash 第一个字段表示用户名为root用户 第二个字段存放了该 ...

  5. H5一二事

    先回顾一下WEB技术的几个阶段 Web 1.0 内容为主,主要流行HTML和CSS Web 2.0 动态网页,流行AJAX/JavaScript/DOM H5 时代,WEB开发回归富客户端 那么H5肯 ...

  6. 验证位置时发生错误:“org.tigris.subversion.javahl.ClientException......

    验证位置时发生错 误:“org.tigris.subversion.javahl.ClientException: RA layer request failed svn: Server sent u ...

  7. Linux umount设备时出现device is busy解决方法

    在Linux中,有时使用umount命令去卸载LV或文件时,可能出现umount: xxx: device is busy的情况,如下案例所示 [root@DB-Server u06]# vgdisp ...

  8. JavaScript Lib Interface (JavaScript系统定义的接口一览表)

    function Object(){}; Object.prototype.toString = function(){return "";}; Object.prototype. ...

  9. Sql Server之旅——第三站 解惑那些背了多年聚集索引的人

    说到聚集索引,我想每个码农都明白,但是也有很多像我这样的猥程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引, 然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,, ...

  10. RabbitMQ入门教程——安装及配置

    RabbitMQ是一个消息代理,一个消息系统的媒介,提供了一个通用的消息发送及接收平台,并且能够保障消息传输过程中的安全.使用erlang语言开发,开源,在易用性.扩展性.高可用性等方面表现不俗 技术 ...