ASP.NET中的错误处理支持
ASP NET具有一个很好的新功能 它对运行时间错误的处理和跟踪提供了丰富支持 特别是 它为管理人员提供了一种很简单的方法 可以保证那些令人恐惧的 ASP ax 十六进制形式的错误永远也不会被显示到客户面前 相反 它允许显示一个较为定制化的信息 比如 对不起 这个站点不可用 ASP NET还提供了一种强大的方法 使开发人员可以对他们的代码进行装备 向管理人员提供发生在工作站点问题的额外信息与通知 本文详细介绍了这两种技术 同时在结尾包括了一个样本代码 你可以直接使用它试验一下 确保不会泄露安全信息 ASP NET同以前的ASP一样 当服务器上发生了一个运行时间或编译时间错误时 就会生成一个 错误页面 但是与ASP不同 ASP NET格外关注的是 要确保在默认状态下 不会因为这个错误的发生而泄露 安全 信息 尤其是如果你从一个远程机器上点击服务器的话 out of the box 型的错误处理设置将不会导致显示远程机器的编译器信息 泄露配置信息 文件名 堆栈记录 源代码或线性数据 相反 远程用户只会看到一个如 发生了应用程序错误 的普通信息 要想查看错误细节 用户必须要 )从本地服务器再次点击页面 或者是 )在机器或应用程序的config web文件中修改配置的设置来允许远程访问
<configuration><customerrors mode= off /></configuration>
我们希望通过将默认状态设置成我们不得不 安全 的样子 从而能够最终帮助保护应用程序的完整性和安全性 并且由此纠正许多ASP开发人员—特别是ASP管理人员都在反映的一个共同的抱怨/担心) 使用定制错误页面 虽然我们发送给用户的公用错误信息是安全的 就是说它不会威胁到应用程序的秘密 但是这样的信息并不好看 也许你希望用户永远也看不到这样的信息 相反 当处理请求的过程中 如果发生了一个为处理的错误 你希望能够显示自己的 定制错误页面 显示出自己的品牌以及特定的错误信息 向ASP NET 应用程序中增加定制错误信息非常容易 首先 编写自己的 web页面 它可以是任何类型的文件 aspx asp 等等 然后在应用程序的config web文件中修改配置信息 让它指向这个文件 举例说明 以下这个配置信息说明在发生了任何未能预定处理错误的情况下 浏览器都应该被重定向到 ErrorPage aspx 页面
<configuration><customerrors mode= remoteonly defaultredirect= ErrorPage aspx /></configuration> <customerrors>
标记中的 defaultredirect 属性定义了在发生错误的情况下 用户将被重定向到的 默认 页面 或者 也可以根据响应的代码状态 重定向到其它的页面来覆盖这个默认值 例如 重定向到一个特殊的 未找到文件 错误页面 非法访问 错误页面 服务器冲突 错误页面等等 举例说明 以下的配置信息覆盖 个特定的 状态代码 所有其它错误都返回到一个默认页面
<customerrors defaultredirect= x mode= remoteonly ><error statuscode= redirect= /><error statuscode= redirect= /><error statuscode= redirect= /></customerrors>
在定制错误页面上有一件事我们已经遇到过 那就是虽然它们对于已经完成的情况非常有用 然而在开发过程中却非常难以对付 因为你预想到在开发过程中会有bug 并且当你发现的时候 真的希望看到实际的错误信息跟踪 为了解决这个问题 <customerrors>标记支持一个有 个值的 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 文件中:
<><body><%Dim xx BlowUp()%></body></>
注意 这个文件总是会引起一个运行时间错误 因为其中引起了一个无效引用例外 而 x 对象根本就没有创建 也没有 Blowup 方法 因此 当你用浏览器点击页面 将看到一个错误信息时 除了在浏览器内看到错误信息外 由于Global asax内部存在Application_Error事件 你还会在NT 事件日志中看到它 要查看这点 请选择 开始菜单 >程序 >管理工具 >事件查看器 然后点击右侧的 MyCustomLog 节点 就会显示出日志的内容 在其内部特定项目上双击就可以看到页面的url以及堆栈的记录细节 注意 NT事件日志可以远程查看 因此这是一个从远处跟踪机器状态的简便方法 还要注意 当你动态创建一个新的NT事件日志时 为了看到它在列表中显示出来 必须每次都退出并重新启动NT事件查看器 既然当新的ASP NET 应用程序内部发生问题时 我们能够轻松地跟踪错误的细节 现在我们就要确保我们的客户所看到的只是友好的定制错误信息 这就要在vroot中创建一个 CustomError aspx 页面
<><body><h > My Custom Error Page</h ><h > Todo: Make this pretty </h ></body></>
然后修改config web文件 让它指向这个页面
<configuration><customerrors mode= on defaultredirect= CustomError aspx /></configuration>
lishixinzhi/Article/program/net/201311/13949