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

news/2024/5/10 9:04:29/文章来源:https://blog.csdn.net/weixin_30415801/article/details/95373035

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


自定义错误页面和异常记录是个很古老的话题了,但依旧可以让人爆到现在。在我做了无数次试验并总结经验和原则后,写下本文,已警后人。

本文的范围和限制

  1. 本文仅仅适用于部署在IIS7或以上版本中的ASP.NET 4.0集成模式应用程序。IIS7以上的意思是Windows Server 2008以上服务器适用。我已在WS2012R2,IIS8上测过。
  2. 本文的方法均适用于ASP.NET WebForm和MVC应用程序。

本文针对的问题

  1. 静态错误页面好还是动态错误页面好?我该如何设计ASP.NET网站错误处理?
  2. 我不希望错误页面后面跟上aspxerrorpath=…这个小尾巴。
  3. 我的自定义错误页面在VS里调试是好的,为什么部署到服务器上就出不来了?
  4. 我的自定义错误页面可以正常显示,但为什么返回的Http状态码不正确?
  5. 异常日志该怎样记录,有没有比较好的实践?

一、错误页面的选择

选择静态html页面作为错误页,还是使用.aspx或是MVC View来显示错误页面好?这个问题许多人的偏好都不一样。我强烈建议大家用html静态页面作为错误页。请看分析:

首先,用动态页面的人,无非是为了解决三个问题:显示错误摘要、记录日志、返回正确的状态码。但是,动态页面最大的问题在于,它们本身是要经过ASP.NET和后台代码处理的,万一你的后台代码是爆的,或者ASP.NET自己爆了,那你的错误页面一旦被请求,本身就会引发另一个错误。而静态html是不会有这个问题的。至于在MVC里专门建一个ErrorController的做法就更不可取了。MVC是基于ASP.NET之上的,MVC的Controller只能抓MVC自己的错误,抓不到ASP.NET的错误,意思就是说,当你的错误并不在MVC层面上的时候,ErrorController没有任何用武之地。例如,当你部署的MVC应用程序缺少MVC的dll时候,MVC框架本身都跑不起来,这个错误如何去抓?

另外,我认为在一个Internet站点上,绝不应该向访客显示任何的错误摘要。这是非常不安全的。所以完全没有必要用动态页面。

至于返回正确状态码的问题是这样的:不少小伙伴发现自己的错误页面能够显示,但返回的状态码是200OK,所以无奈之下用动态页面,写上Response.StatusCode = 500这样的代码来强撸。这个在稍后的文章里有解决方案,所以不要为了状态码而冒险用动态页面。有的小伙伴会问,我只写一笔Response.StatusCode=500能有什么风险?呵呵,想想这种情况:404.cshtml,razor引擎的dll不见了……

另外,一个原则是:错误页面应当是独立的。如果你的静态页面要用到图片和CSS等外部资源,建议嵌入在页面里边,做成单文件的,以免显示错误页面时请求相关资源再次引发异常。小伙伴又要问了,请求个CSS和图片什么的,肿么会引发异常呢?那你看看这个:resources.axd?image=…,呵呵。

那么用了静态页面以后,记录日志怎么办呢?正确的方法应该是交给Global.asax中的“Application_Error”事件处理。稍后会有翔解。

二、配置错误页面:customErrors VS httpErrors

首先,错误页面的显示方式有两种。如果你打开IIS,会看到两个配错误页的地方:.NET Error Pages和Error Pages。

站在开发者的角度来说,ASP.NET Section下的“.NET Error Pages”就是web.confg/system.web/customErrors节点。而IIS Section下的”Error Pages”是web.config/system.webServer/httpErrors节点,这个是IIS7以上特有的。

任何在IIS上对这两处的更改其实都是在修改web.config文件。

那么我们该用哪一个来配置自定义错误页呢?我的一个原则是:让IIS向用户展示错误页面,而不要依赖于ASP.NET。 猿因如下:

CustomError的问题:

a)  在默认情况下,CustomError会采用302重定向的方式来展示错误页面,如果客户端请求了一个404的页面,那它得到的将会是一个302紧接着一个200OK,对于人类来说这是OK的,毕竟用户看到了友好的错误页面,但搜索引擎会认为这个不存在的地址是正常的页面,并把你的404页面收入搜索结果。并且每次引发错误,URL后边都会跟上aspxerrorpath这个小尾巴,比如:

http://yoursite.com/404.html?aspxerrorpath=/somethingnotexsit

b) 在配置了redirectMode=“ResponseRewrite”后,会引发一个问题,09年就有人当bug提交到MS Connect上了,但目前微软不打算fix这个bug。即该模式在VS自带的ASP.NET Development Server上是有效的,浏览器显示的是解析后的HTML页面,而部署到IIS上之后,浏览器显示是raw html,即你的错误页面的HTML代码。并且该行为不具有确定性,天晓得你的网站换个环境部署又会爆成什么样。

c)  IIS7以上版本的特殊性:在集成模式下,IIS的错误页面会优先于ASP.NET错误页面,即IIS的默认错误页会覆盖你配置的CustomErrors页面,这就是为什么你在VS下调试是好的,部署到服务器上就爆了。

在IIS7之后,取决于你的配置,用户的请求并不都一定在ASP.NET管线上处理。如果引发异常的地方不在ASP.NET,那就不会显示CustomErrors的错误页面。

所以,我强烈建议大家用httpErrors节点替代CustomErrors来配置错误页面。

三、File还是ExecuteURL:httpErrors的正确配法

先贴一个正确的配置样例:是用File配的。

注意两处地方:

  1. 斜杠是Windows文件路径的反斜杠“\”而不是网址URL的斜杠“/”
  2. Path不要以“~”或“\”开头

不要问我为什么,我也不知道,反正这么弄就是好的。

如果你不幸用了ExecuteURL,你会发现URL路径只能以“/”开头:

并且你的错误页会返回200OK而不是正确的404、500等错误码。这在我以前的文章里写过:

http://diaosbook.com/Post/2012/6/24/correct-way-to-implement-custom-error-page-return-statecode-instead-of-http-200

而用File的意思是,当错误被爆出来之后,IIS会把目标File,比如404.html的内容,塞到当前的Response流里面,保持Http状态码依旧是404。这就是我们想要的。

四、异常日志记录

文章在一开始就提了个问题,木有了动态页面,怎么记录错误日志?我的做法是在Global.asax里处理。

Application_Error事件样例代码如下:

var exception = HttpContext.Current.Server.GetLastError(); if (null != exception) { // by default 500 var statusCode = (int)HttpStatusCode.InternalServerError; if (exception is HttpException) { statusCode = new HttpException(null, exception).GetHttpCode(); } else if (exception is UnauthorizedAccessException) { // to prevent login prompt in IIS // which will appear when returning 401. statusCode = (int)HttpStatusCode.Forbidden; } if ((LogHttpNotFound && statusCode == 404) || statusCode != 404) { if (null != _loggerFunc) { LoggerFunc(string.Format("ASP.NET Error Captured, Request URL: {0}, Exception:", HttpContext.Current.Request.Url), exception); } } ExceptionInfo = exception.Message; _statusCode = statusCode; }

一个小小的建议是不要记录404错误,因为你的网站在Internet上会被各种搜索引擎、扫描工具和黑客菊爆,有一种攻击手段是通过字典猜解目录,返回404就是不存在,返回403就是存在。所以,当你碰到这种无聊黑客的时候,如果记录了404请求,那你的日志会非常的大……

我记日志用的组件是NLog,配置简单,使用容易。Log4net这货已经好久没更新了。

如果你决定自己设计日志模块,那要记住两个原则:

日志模块本身并不能因为自己爆掉而影响整个系统运行,即任何在日志模块里的异常不应该向外冒泡。

考虑并发写日志的情况,日志操作应该是Fire and Forget的,不能让应用程序等待日志写入。

五、总结

  1. 采用静态html页面作为错误页。
  2. 采用httpErrors配置错误页面,目的是兼容IIS7以上环境、返回正确错误码、去掉aspxerrorpath小尾巴。
  3. 日志记录写在Global.asax里,在Application_Error事件中记录。

转载于:https://www.cnblogs.com/sherlock99/p/4109035.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_713395.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样调整input框背景颜色_还在用百度搜索PPT背景图?7个高大上的图片网站,个个都是高清免费无版权!...

Hi,各位叨友们好呀!我是叨叨君~很多人在做PPT的时候都有这样的疑问,那些高大上的PPT背景图都是哪儿找的?花钱购买的吗?NO NO NO~花钱是不可能的,花时间找还差不多。今天给大家分享几个高逼格的PPT背景图免费…

【阅读理解】机器阅读理解方向有什么值得follow的大佬,网站等等?

点击上方,选择星标或置顶,每天给你送干货!阅读大概需要9分钟跟随小博主,每天进步一丢丢来自 | 知乎地址 | https://www.zhihu.com/question/358469127/answer/1028144909作者 | Scofield编辑 | 机器学习算法与自然语言处理公众号本…

对搜狐、网易和TOM三大门户网站的SQL注入漏洞检测

对搜狐、网易和TOM三大门户网站的SQL注入漏洞检测 本文节选自《大中型网络入侵要案直击与防御》一书 此外,笔者对搜狐及TOM和网易这三大门户网站作了注入攻击检测,发现同样存在明显的注入漏洞,安全性很糟糕。 1.MySQL注入检测搜狐门户网站 …

推荐130 个相见恨晚的神器网站

点击上方,选择星标或置顶,每天给你送干货!阅读大概需要7分钟跟随小博主,每天进步一丢丢来源:https://blog.csdn.net/qq_43901693/article/details/100606828搞学习知乎:www.zhihu.comTED(最优质…

Drupal是基于PHP语言编写的用于开发网站的开发型CMF

序 Drupal诞生于2000年,是一个基于PHP语言编写的用于开发网站的开发型CMF(内容管理框架)。Drupal强大的定制开发能力,也使其成为众多有技术实力的网站建设公司优先选用的网站开发平台。 任何网站建设公司自己开发的系统&#xf…

博文视点大讲堂41期-SEO难点之网站内部链接结构

博文视点大讲堂41期 SEO难点之网站内部链接结构 SEO是什么? 虽然这些年SEO概念普及了,但在很多人眼里,SEO和作弊、欺骗是一回事儿。这是对SEO的极大误解。 SEO是个强有力的工具,能以很合理的方式进行,既照顾到用户…

php解密 hr+c_PHP每15分钟自动更新网站地图(减少服务器消耗)

php中文网最新课程每日17点准时技术干货分享最近在弄一个短网址,自己写的代码。锻炼一下自己。在做html网站地图这块,想着把所有生成的短连接都展示出来,方便收录。就写了一个sitemap.php,后来发现,如果以后人流量大或…

众多SEO专家集体盛赞

《SEO实战密码》将给你思路、眼界和方法的拓展之道。选一个适宜阅读的角落,一杯咖啡,一支笔,听Zac系统地讲SEO知识、见解和经验分享吧。我们都知道,你的竞争对手也会是Zac的粉丝。 葛小飞(天真)&#xff0…

博文视点大讲堂41期——SEO难点之网站内部链接结构 圆满成功

博文视点大讲堂41期——SEO难点之网站内部链接结构 圆满成功 2010年11月21日,电子工业出版社博文视点在中关村图书大厦五层如期举办了“博文视点大讲堂第41期:SEO难点之网站内部链接结构”,本次活动邀请经典畅销图书《网络营销实战密码》作者…

配置 php_零基础建站如何配置PHP运行环境 几种服务器环境配置的选择和方法

上次给大家分享了小白建站如何选择虚拟空间及服务器,及购买域名的基础知识,这些是硬性要求,你的网站要想运行起来,硬件只是基础,真正的技术是软件,关于PHP软件开发技术,后面我们会慢慢的分享给大…

《SEO实战密码》终于上市了

经过几番折腾,《SEO实战密码》终于陆续在主要网站和书店上架了,读者目前可以在中国互动出版网、当当(普通版)、卓越亚马逊、淘宝购买。另外,前几天回国时到出版社签名了200本书,签名版已全部交当当出售&…

在一堆人还在犹豫《SEO实战密码》是否值得购买的时候,在下已经收藏了1/10的签名版

只能说那些犹豫的朋友们太没眼光了,论国内SEO,如果连Zac都信不过,还有谁可信? 当我得知Z大的签名版上架,我毫不犹豫地从床底拉出鞋盒,从左脚的鞋内拿出1000元,从右脚的鞋内拿出200元&#xff0…

超人气新书《SEO实战密码——60天网站流量提高20倍》火爆热销

超人气新书《SEO实战密码——60天网站流量提高20倍》火爆热销 11月底,《SEO实战密码——60天网站流量提高20倍》在全国读者的翘首企盼中正式面市,仅一周的时间,它便以令人窒息的速度在卓越网迅速脱销,当当网签名本2天之内抢售一空…

读书:《SEO实战密码》

作者:魏武挥 来源: It Talks 新加坡人昝辉Zac于09年曾出过一本《网络营销实战密码:策略、技巧、案例》,书名虽然波澜不惊,但那本书,在我看来,是最好的营销实战宝典,尤其适合一些刚刚起步的中…

网站运营之比较和差异化

网站运营之比较和差异化 人类内心有很多情绪,其中一种最基本的情绪是嫉妒。人类社会的幸福不在于你拥有什么,而在于比较。这个比较可能是负面的,也可能是正面的。比如说,良好的竞争,这是一种正向的比较,能…

网站运营之前后一致

网站运营之前后一致 谈判大师罗杰道森在谈个人影响力时提到“敬畏力”的概念,认为敬畏力来自于人们言行一致的力量。有些人的敬畏力强,有些人的敬畏力弱。但是不管如何,大多数人都有一个心理趋向,即保持前后一致。人们不太喜欢前…

压力测试网站_JMeter简单压力测试教程

JMeter并发测试 Jmeter是一个非常好用的压力测试工具。Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好。 目录1.什么是压力测试 2.做压力测试的常用工具 3.做压力测试的步骤4.做压力测试的例子 什么是压…

实战SEO——实用技法与案例剖析

实战SEO——实用技法与案例剖析 藏锋者 编著 ISBN978-7-121-14273-4 2011年9月出版 定价:55.00元 16开 472页 内 容 简 介 本书针对SEO细节操作、技术实施、实际案例进行了详细分析,主要包括建站前的SEO策划、网站上线前的本地SEO、上线后的S…

网站结构优化的基本方法

网站结构优化的基本方法 网站结构优化就是对网站页面的存储方式(物理结构)、内部链接关系(逻辑结构)进行合理的调整,以减少网站的目录层级,优化普通页面与重要页面之间的链接深度,增加重要页面…

什么是网站物理结构、逻辑结构

什么是网站物理结构、逻辑结构 网站结构分为物理结构和逻辑结构两种,很多刚刚接触SEO的新手,往往搞不清楚物理结构和逻辑结构的异同,进而造成自己的网站结构规划很乱,不但搜索引擎不容易快速建立起网站的整体结构体系&#xff0c…