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

原文:http://www.cnblogs.com/dudu/p/aspnet_custom_error.html

要在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日志)。

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

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

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

ASP.NET中处理自定义错误的最佳方式,布布扣,bubuko.com

时间: 2024-12-20 10:00:39

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

grails Domian对象转JSON去class以及自定义字段的最佳方式

grails:2.4.x IDE:Intellij IDEA 13.x grails的Domain对象之间如果存在环形引用,直接使用as JSON只会输出关联对象的id,并且如果使用deep也会报错且deep并不支持层级输出设置.达不到一些程序的使用需求. 所以自己在网上翻了很多资料,最终测试出一个比较简单可靠的方案: 1.在config.groovy中添加一句针对JSON转换的配置 grails.converters.default.circular.reference.behaviour =

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

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

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

在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是网站所依赖的宿主抛出的,一般来讲我们所依赖的宿主就是IIS了. IIS中的错误页入口: 其中的错误码想必并不陌生 这里是在服务器上找不到所需资源时抛出的错误页,在这里可以设置需要展示的错误页面,只需将预定的错误页面加入服务器中,然后在指定状态码下配置路径即可. 这是请求在IIS中时,还未完全进入到a

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

开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有3-5年经验的,有5-10年经验的,对于所有的面试者,我几乎问了同一道题:"请说说你所知道的页面之间传值的几种形式和方法, 并阐述他们的原理和过程",关于这道题,从大家的回答来看,结果并不是很理想,从种类上来说,大部分人回答5种左右,极少部分能回答8种,没有超过8种的,但从深度上来说,很少

在ASP.NET中创建自定义配置节(翻译)

2017年,共享经济持续成为大众关注的焦点,从共享单车.共享雨伞.共享充电宝,到共享电动车.共享汽车.共享床位,甚至连女友都拿来共享了.戴上"共享"高帽的创业项目一茬接一茬地冒出来,正如收割的韭菜,最开始两茬是最嫩的,接下来生长出来的则会让人觉得食之无味又弃之可惜.对于投资人如此,对于用户们来说有何尝不是呢? 让我们盘点下近一年出现过的"共享"明星们,对于它们,死亡还是生存?这是个问题. 据统计,2016年中国的共享经济市场规模接近4万亿元:2017年,共享系宣告进

Asp.net中防止自定义配置文件被非法访问

假定在站点的根目录下有一个名为config下的文件夹,它里面有一些后缀名为.xml的配置文件,如db.xml.默认情况下,这些文件是可以通过以下方式访问的: http://yourSitenName/config/db.xml 为防止这种情况漏洞的出现,可以通过在config目录下添加一个web.config文件,加入以下内容: <?xml version="1.0" encoding="UTF-8"?> <configuration> &l

ASP.NET5 中静态文件的各种使用方式

所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况下,静态文件被存放在项目的wwwroot目录下,而wwwroot的地址被定义在project.json文件中: { "webroot": "wwwroot", ... } 静态文件被存储在wwwroot下的任何目录中,它被客户端以相对路径的方式访问,例如,当你在Visu

Asp.net中全局缓存的几种方式

public class StaticCacheTest { private static IDictionary<string, object> _dic; private static object locker = new object(); private static IDictionary<string, object> CachedDic { get { if (_dic == null) { lock (locker) { if (_dic == null) { _

在Azure中运行虚拟应用的最佳方式&mdash;&mdash;XenApp

之前写过两篇博客,介绍Microsoft将其虚拟应用RemoteApp放到了Azure云平台,利用这种方式,将传统的Windows应用转化成类似SaaS应用的交付方式. 有关各类应用及其将来发展的思考,暂且不提,不过微软忽然停止了支持RemoteApp. 作为老牌应用虚拟化厂商,Citrix 的XenApp广为人知,现在,XenApp已经把方案部署到了Azure中.通过Azure市场,即可找到XenApp的试用. 从Citrix官网的介绍来看,XenAp在Azure中的架构和私有云搭建的架构有所