ASP.NET中处理自定义错误的最佳方式
要在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中处理自定义错误的最佳方式的更多相关文章
- ASP.NET Core中显示自定义错误页面-增强版
之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...
- python中逐行读取文件的最佳方式_Drupal_新浪博客
python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式 (2010-08-18 15:59:28) 转载▼ 标签: python ...
- ASP.NET Core中显示自定义错误页面
在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...
- ASP.NET MVC下自定义错误页和展示错误页的几种方式
在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...
- redirect的错误用法asp.net怎么使用自定义错误
工作了几年,写过程序也运营过网站,自定义错误也很熟悉了,最近再做项目发现有同事写了这样的代码 if (action != null) { id = Request.QueryString[" ...
- 在ASP.NET中引用自定义提示框
在html网页中自定义提示框 正文: 在一般的B/S架构中项目,与用户的交互信息是非常重要的.在一般的情况下,设计人员都在把用户信息呈现在html中,用div和span去弹出相关信息.对于一般的情况而 ...
- ASP.Net中页面传值的几种方式
开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...
- ASP.NET中处理异常的几种方式
1.程序中使用try catch 对于预知会发生异常的代码段使用try catch主动捕获异常,适用于提示给用户或跳转到错误页面,或者通过其它方式处理异常(日志.通知等). int i = 10; i ...
- ASP.NET中指定自定义HTTP响应标头
新建一个类HideServerHeaderHelper,继承 IHttpModule,然后重写 OnPreSendRequestHeaders,Dispose,Init方法,如下代码所示 using ...
随机推荐
- HTTPS时代全面到来,你准备好了吗?
近一年可能有很多朋友发现在使用百度搜索时,是这个样子的 如我们所见,浏览器地址栏里的HTTP可能将成为永远的过去时,取而代之的是更安全的HTTPS. 首先,HTTPS是什么? HTTPS是Http O ...
- 【原】ios的hitTest方法以及不规则区域内触摸事件处理方法
概述 在正常的使用场景中,我们处理了比较多的矩形区域内触摸事件,比如UIButton.UIControl.一般来说,这些控件的图形以及触摸区域都是矩形或者圆角矩形的.但是在一些特殊应用场景中我们有时不 ...
- [Android]proguard重新编译和如何不混淆第三方jar包
转载自:http://glblong.blog.51cto.com/3058613/1536516 一.ant安装.环境变量配置及验证 (一)安装ant 到官方主页http://ant.apache. ...
- nodejs events模块
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); console.log(emi ...
- 传统模式下WebService与WebAPI的相同与不同
1.WebService是利用HTTP管道实现了RPC的一种规范形式,放弃了对HTTP原生特征与语义的完备支持:而WebAPI是要保留HTTP原生特征与语义的同时实现RPC,但WebAPI的实现风格可 ...
- C#生成注册码
string t = DateTime.Now.Ticks.ToString(); t = DESKey.DESEncrypt(t, DESKey.DesKeyStr); string[] strid ...
- SQL Server 使用游标更新数据库中的数据(使用存储过程)
ALTER PROCEDURE [dbo].[POR_CURSOR_FOR_UPDATE] --创建存储过程 AS BEGIN SET nocount ON --忽略行数显示 DECLARE Upda ...
- c# UpdateLayeredWindow异形窗口
#region UpdateLayeredWindow #region 重写窗体的 CreateParams 属性 protected override CreateParams CreatePara ...
- IIS7配置PHP图解(转)
IIS7+PHP_5.2.17 于之前安装IIS的时候已经选上了isapi扩展和isapi筛选,这里就不用另外再添加角色服务了,直接开始 先修改php.ini文件.. 把c:\php下的php.ini ...
- 烂泥:puppet3.7安装与配置
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 有关服务器的自动化管理,这方面以前没有接触过.打算这段时间把这块知识给补上. 现在服务器自动化管理软件,使用最多也最火的就是puppet了. 那么我们今 ...