ASP.NET中的错误处理支持(转)

asp.net|错误|错误处理

ASP.NET中的错误处理支持

ASP.NET具有一个很好的新功能:它对运行时间错误的处理和跟踪提供了丰富支持。特别是,它为管理人员提供了一种很简单的方法,可以保证那些令人恐惧的“ASP 43433ax”十六进制形式的错误永远也不会被显示到客户面前。相反,它允许显示一个较为定制化的信息,比如“对不起,这个站点不可用”。ASP.NET还提供了一种强大的方法,使开发人员可以对他们的代码进行装备,向管理人员提供发生在工作站点问题的额外信息与通知。本文详细介绍了这两种技术,同时在结尾包括了一个样本代码,你可以直接使用它试验一下。

确保不会泄露安全信息

ASP.NET同以前的ASP一样,当服务器上发生了一个运行时间或编译时间错误时,就会生成一个html 错误页面。但是与ASP不同,ASP.NET格外关注的是:要确保在默认状态下,不会因为这个错误的发生而泄露“安全”信息。尤其是如果你从一个远程机器上点击服务器的话。“out of the box”型的错误处理设置将不会导致显示远程机器的编译器信息、泄露配置信息、文件名、堆栈记录 、源代码或线性数据。相反,远程用户只会看到一个如“发生了应用程序错误”的普通信息。要想查看错误细节,用户必须要:1)从本地服务器再次点击页面,或者是 2)在机器或应用程序的config.web文件中修改配置的设置来允许远程访问:

<configuration>
<customerrors mode="off" />
</configuration>

我们希望通过将默认状态设置成我们不得不“安全”的样子,从而能够最终帮助保护应用程序的完整性和安全性。并且由此纠正许多ASP开发人员—特别是ASP管理人员都在反映的一个共同的抱怨/担心)。

使用定制错误页面

虽然我们发送给用户的公用错误信息是安全的,就是说它不会威胁到应用程序的秘密,但是这样的信息并不好看。也许你希望用户永远也看不到这样的信息。相反,当处理请求的过程中,如果发生了一个为处理的错误,你希望能够显示自己的“定制错误页面”,显示出自己的品牌以及特定的错误信息。

向ASP.NET 应用程序中增加定制错误信息非常容易。首先,编写自己的 web页面,它可以是任何类型的文件:.htm,.aspx,.asp,等等。然后在应用程序的config.web文件中修改配置信息,让它指向这个文件。

举例说明,以下这个配置信息说明在发生了任何未能预定处理错误的情况下,浏览器都应该被重定向到“ErrorPage.aspx”页面:

<configuration>
<customerrors mode="remoteonly" defaultredirect="ErrorPage.aspx" />
</configuration>

<customerrors>标记中的“defaultredirect”属性定义了在发生错误的情况下,用户将被重定向到的“默认”页面。或者,也可以根据响应的http代码状态,重定向到其它的页面来覆盖这个默认值。例如:重定向到一个特殊的“未找到文件”错误页面、“非法访问”错误页面、“服务器冲突”错误页面等等。

举例说明,以下的配置信息覆盖3个特定的http 状态代码,所有其它错误都返回到一个默认页面:

<customerrors defaultredirect="http://anotherhost/error.aspx" mode="remoteonly">
<error statuscode="500" redirect="http:/anotherhost/pages/callsupport.html" />
<error statuscode="404" redirect="http:/anotherhost/pages/adminmessage.html" />
<error statuscode="403" redirect="http:/anotherhost/pages/noaccess.html" />
</customerrors>

在定制错误页面上有一件事我们已经遇到过,那就是虽然它们对于已经完成的情况非常有用,然而在开发过程中却非常难以对付。因为你预想到在开发过程中会有bug,并且当你发现的时候,真的希望看到实际的错误信息跟踪。为了解决这个问题,<customerrors>标记支持一个有3个值的“mode”属性:

“on”:意思是总是发出定制错误页面;

“off”:意思是从不发出定制错误页面(你总是看到原始的错误信息);

“remoteonly”:意思是只有当远程浏览器点击站点时才发出定制错误页面(而在实际机器上点击站点的开发人员看到的是详细的错误信息)。

装备应用程序帮助管理员跟踪错误

虽然向客户显示定制的错误信息是一件好事,但也许你还是希望,当一个错误在站点上发生时,开发人员和管理员能够很容易地实时发现它,并且识别出是什么问题、url及例外信息是什么。

为了解决这个问题,ASP.NET引入了一个可以在Global.asax文件中处理的新的“应用程序层”事件:“Application_Error”。在处理一个web请求的过程中,当有一个未处理的例外发生时,这个方法就被调用。开发人员从中可以获得有关请求的特殊信息,例如:要弹出页面的url、查询字符串变量、用户代理、cookie的值等等,以及封装错误信息的实际例外对象的信息。然后就可以继续进行,运行任何他们想要跟踪以及用来通知管理员和开发人员有关问题的逻辑,这可能包括使用 System.Diagnostic APIs向NET事件日志写入信息、使用System.Web.Util SMTP Email APIs向管理员发email、向一个数据库中写入信息等等。

举例说明,以下的Global.asax文件演示了如何向一个定制NT事件日志“MyCustomLog”写入错误信息,包括页面url和例外堆栈记录:

<%@ Import Namespace="System.Diagnostics" %>
<script language="VB" runat=server>
Sub Application_Error(Sender As Object, E as EventArgs)
'Obtain the URL of the Request
Dim PageUrl as String = Request.Path
'Obtain the Exception Object for the Error
Dim ErrorInfo as Exception = Server.GetLastError()
'Construct Error Message to Write to NT Event Log
Dim Message As String = "Url " & PageUrl
Message = Message & " Error: "
Message = Message & ErrorInfo.ToString
'NT Event Log Name to Write Message To
Dim LogName As String = "MyCustomLog"
'Create Event Log if It Doesn’t Exist
If (Not EventLog.SourceExists(LogName)) Then
EventLog.CreateEventSource(LogName, LogName)
End if
'Fire off to Event Log
Dim Log as New EventLog
Log.Source = LogName
Log.WriteEntry(Message, EventLogEntryType.Error)
End Sub
</script>

要想看到上门所描述的一切实际是如何工作的,试着在机器上创建一个新的IIS应用程序vroot,然后将上面的样本代码复制到一个新的“Global.asax”文件中,这个文件是在应用程序根目录中创建的。然后,将以下代码片段复制/粘贴到“Blowup.aspx”文件中:

<html>
<body>
<%
Dim x
x.BlowUp()
%>
</body>
</html>

注意,这个文件总是会引起一个运行时间错误,因为其中引起了一个无效引用例外,而“x”对象根本就没有创建,也没有“Blowup”方法。因此,当你用浏览器点击页面,将看到一个错误信息时。

除了在浏览器内看到错误信息外,由于Global.asax内部存在Application_Error事件,你还会在NT 事件日志中看到它。要查看这点,请选择“开始菜单->程序->管理工具->事件查看器”,然后点击右侧的“MyCustomLog”节点,就会显示出日志的内容。在其内部特定项目上双击就可以看到页面的url以及堆栈的记录细节。

注意:NT事件日志可以远程查看,因此这是一个从远处跟踪机器状态的简便方法。还要注意:当你动态创建一个新的NT事件日志时,为了看到它在列表中显示出来,必须每次都退出并重新启动NT事件查看器。

既然当新的ASP.NET 应用程序内部发生问题时,我们能够轻松地跟踪错误的细节,现在我们就要确保我们的客户所看到的只是友好的定制错误信息。这就要在vroot中创建一个“CustomError.aspx”页面:

<html>
<body>
<h1> My Custom Error Page</h3>
<h3> Todo: Make this pretty.... </h3>
</body>
</html>

然后修改config.web文件,让它指向这个页面:

<configuration>
<customerrors mode="on" defaultredirect="CustomError.aspx"/>
</configuration>

这时请再次点击BlowUp.aspx页面,你会看到浏览器被自动重定向到友好的错误页面。如果你查看NT事件日志的话,会看到关于这个错误对一个管理员进行通知时必要的所有细节,以及开发人员要识别和修复它所必要的所有细节。

要注意,由于客户信息信息被存储在config.web 文件而不是IIS元数据中,因此它可以通过“xcopied”进行安装,而不需要请求用户使用IIS Admin 工具。ASP.NET的这种客户定制功能在IIS4 和IIS5中也同样奏效。

时间: 2024-12-08 16:35:09

ASP.NET中的错误处理支持(转)的相关文章

ASP.NET中的错误处理支持

asp.net|错误|错误处理 ASP.NET具有一个很好的新功能:它对运行时间错误的处理和跟踪提供了丰富支持.特别是,它为管理人员提供了一种很简单的方法,可以保证那些令人恐惧的"ASP 43433ax"十六进制形式的错误永远也不会被显示到客户面前.相反,它允许显示一个较为定制化的信息,比如"对不起,这个站点不可用".ASP.NET还提供了一种强大的方法,使开发人员可以对他们的代码进行装备,向管理人员提供发生在工作站点问题的额外信息与通知.本文详细介绍了这两种技术,

Asp开发中常见错误提示及其意义说明

MicrosoftVBScript语法错误(0×800A03E9)–>内存不足 MicrosoftVBScript语法错误(0×800A03EA)–>语法错误 MicrosoftVBScript语法错误(0×800A03EB)–>缺少?':' MicrosoftVBScript语法错误(0×800A03ED)–>缺少?'(' MicrosoftVBScript语法错误(0×800A03EE)–>缺少?')' MicrosoftVBScript语法错误(0×800A03EF)–

ASP.NET中分析器错误:发现不明确的匹配

这是一个不好的代码习惯引起的发布后运行时的问题.错误原因为.net2.0无法正确识别服务器控件和变量的大小写区别,但是这个错误只有在iis中体现,在文件系统的调试中没有发生. 错误信息 引发错误的参考代码如下: public partial class _Default : System.Web.UI.Page { private string button1="test"; protected void Page_Load(object sender, EventArgs e) {

在ASP应用中验证用户身份

    交互式的Web应用比那些只提供静态Web页面的站点要求考虑更多的安全问题.注册与密码是保护敏感信息最为常用的手段.由于ASP没有直接提供验证用户身份的方法,因此,用户必须执行登录过程以便应用系统保存和提取用户相关信息.    一.示例站点概貌    本文通过一个示例站点ASPSecurity说明ASP应用中注册与密码保护的一般实现过程.我们把用户信息保存在Web服务器上的一个Access97数据库中,DSN名称为   ASPSecurity.唯一的数据库表拥有以下字段:Signon(文本

在ASP应用中验证用户身份(2)

二.初始化以及用户输入合法性检查 当一个ASP应用启动的时候,IIS就会寻找一个global.asa文件.如果该文件存在,就开始执行Application_onStart.在这里可以初始化应用级的变量和常量.下面的代码在Application_OnStart中初始化一个数组来跟踪任意时刻登录系统的所有用户: Sub Application_OnStartApplication("Users") = Array()End Sub 在执行Application_OnStart之后,ASP引

ASP .NET 中的身份验证:.NET 安全性指导

安全|安全性 摘要本文讨论了设计服务器应用程序时考虑安全性的重要性.Internet Information Services 和 ASP .NET 均提供了安全模型,以便您对用户进行适当的身份验证,并在应用程序中获得正确的安全环境. -------------------------------------------------------------------------------- 目录简介安全性考虑IIS 和 ASP .NET 之间的关系身份验证方法Web 服务的安全性代码访问安全

ASP开发中遇到的错误信息中文说明大全

错误|中文 如果你搞过ASP的开发,你就会为ASP中没有好的完整的调试环境而头疼不己.我收集了网上相关所有信息提示,想给它做成单机的ASP开发错误提示软件中的数据库,但是我发现应该还有些是我所不清楚或说是了解的.所以放在这里,请知道的朋友再次提出你的观点或说更详细的信息,我将非常感激!如果有好的建议,如果软件出来后,我将首先免费送给您尝试使用! 再次希望看到这个文章的朋友们,能够支持和鼓励我做这个东西!(反正我觉得做这样东西的好像就没有啊),请大家指出问题并且补充!!!呵!!!!!-------

在 ASP.NET 中支持数据库缓存相关性

asp.net|缓存|数据|数据库 开发人员都喜欢 ASP.NET 应用程序缓存. 一个原因是 ASP.NET 能够在放入缓存中的项与文件系统中的文件之间创建相关性. 如果相关性所针对的文件更改,ASP.NET 会自动将相关项从缓存中删除. 通过与缓存删除回叫(当缓存项删除时向所有关注方广播通知)结合,缓存相关性为开发人员提供了方便,使他们得以通过尽量减少耗时的文件访问来最大限度地提高性能,因为这使他们可以放心地允许文件数据缓存,而不必担心数据变得陈旧. 尽管缓存相关性非常实用,但是在 ASP.

ASP开发中可能遇到的错误信息中文说明大全(整理收集)第1/2页_应用技巧

如果你搞过ASP的开发,你就会为ASP中没有好的完整的调试环境而头疼不己.我收集了网上相关所有信息提示,想给它做成单机的ASP开发错误提示软件中的数据库,但是我发现应该还有些是我所不清楚或说是了解的.所以放在这里,请知道的朋友再次提出你的观点或说更详细的信息,我将非常感激!如果有好的建议,如果软件出来后,我将首先免费送给您尝试使用! 再次希望看到这个文章的朋友们,能够支持和鼓励我做这个东西!(反正我觉得做这样东西的好像就没有啊),请大家指出问题并且补充!!!呵!!!!!-------------