ASP.NET中处理自定义错误的最佳方式

王朝学院·作者佚名  2016-05-06
窄屏简体版  字體: 小  |  中  |  大  |  超大  

要在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 == 404)

{

Response.StatusCode = 404;

Server.ClearError();

return;

}

}

CNBlogs.Infrastructure.Logging.Logger.Default.Error("Application_Error", lastError);

Response.StatusCode = 500;

Server.ClearError();

}

}

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

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

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

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

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

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航