ASP.NET中的错误处理支持

ASP.NET中的错误处理支持

 
向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 RequestDim PageUrl as String = Request.Path'Obtain the Exception Object for the ErrorDim ErrorInfo as Exception = Server.GetLastError()'Construct Error Message to Write to NT Event LogDim Message As String = "Url " & PageUrlMessage = Message & " Error: "Message = Message & ErrorInfo.ToString'NT Event Log Name to Write Message ToDim LogName As String = "MyCustomLog"'Create Event Log if It Doesn’t ExistIf (Not EventLog.SourceExists(LogName)) ThenEventLog.CreateEventSource(LogName, LogName)End if'Fire off to Event LogDim Log as New EventLogLog.Source = LogNameLog.WriteEntry(Message, EventLogEntryType.Error)End Sub</script> 
要想看到上门所描述的一切实际是如何工作的,试着在机器上创建一个新的IIS应用程序vroot,然后将上面的样本代码复制到一个新的“Global.asax”文件中,这个文件是在应用程序根目录中创建的。然后,将以下代码片段复制/粘贴到“Blowup.aspx”文件中: 
<html><body><%Dim xx.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中也同样奏效。

posted @ 2009-09-23 12:43  书奎  阅读(169)  评论(0编辑  收藏  举报