Создание пользовательских страниц отчетов об ошибках в ASP.NET с помощью Visual Basic .NET
В этой статье описывается, как использовать код Microsoft Visual Basic .NET для перехвата и реагирования на ошибки, возникающие в ASP.NET.
Исходная версия продукта: Visual Basic .NET, ASP.NET
Исходный номер базы знаний: 308132
Итоги
ASP.NET улучшили параметры обработки ошибок на традиционных страницах Active Server (ASP). В ASP.NET можно обрабатывать ошибки на нескольких разных уровнях в приложениях.
Новые возможности в ASP.NET
ASP.NET предлагает несколько достижений в том, как обрабатывать и реагировать на ошибки. В традиционном ASP выполняется обработка ошибок с On Error Resume Next
помощью (или try-catch
блоков в JScript). Кроме того, если выполняется службы IIS (IIS), объект используется ASPError
для создания пользовательской страницы отчетов об ошибках. Однако эти подходы имеют свои ограничения.
ASP.NET предоставляет несколько уровней, на которых можно обрабатывать и реагировать на ошибки, которые могут возникнуть при запуске приложения ASP.NET. ASP.NET предоставляет три основных метода, которые позволяют перехватать и реагировать на ошибки при их возникновении: Page_Error
событие, Application_Error
событие и файл конфигурации приложения (Web.config).
В этой статье показано, как использовать эти новые функции в приложении ASP.NET. Хотя в этой статье описывается предоставление пользовательских страниц ошибок и общих отчетов об ошибках, связанных непосредственно с ASP.NET, в этой статье не описываются другие подходы к обработке ошибок, такие как try-catch-finally
блок и система исключений среды CLR.
Использование события Page_Error
Событие Page_Error
предоставляет способ ловушки ошибок, возникающих на уровне страницы. Вы можете отобразить сведения об ошибке (как пример кода для выполнения) или записать событие или выполнить другое действие.
Примечание.
В этом примере отображаются подробные сведения об ошибках в браузере только для демонстрационных целей. При отображении подробных сведений пользователю приложения необходимо быть осторожным, особенно если приложение запущено в Интернете. Более подходящим действием будет отображаться сообщение пользователю, уведомляющее пользователя о том, что произошла ошибка, а затем фактически регистрировать конкретные сведения об ошибке в журнале событий.
В этом примере возникает исключение NULL, которое приводит к возникновению ошибки в событии Page_Load
. Выполните следующие действия, чтобы создать начальную страницу, которая будет тестировать Page_Error
событие.
Выполните следующие действия, чтобы добавить новый файл с именем PageEvent.aspx в проект:
- Откройте Visual Studio .NET.
- В Обозреватель решений щелкните правой кнопкой мыши узел проекта, наведите указатель мыши на "Добавить" и нажмите кнопку "Добавить веб-форму".
- В текстовом поле "Имя" введите PageEvent.aspx и нажмите кнопку "Открыть".
Добавьте следующий код в PageEvent.aspx:
<%@ Page Language="vb"%> <script runat=server> Sub Page_Load(Sender as object, e as EventArgs) throw(new System.ArgumentNullException()) End Sub Sub Page_Error(Sender as object, e as EventArgs) Dim objErr as Exception = Server.GetLastError().GetBaseException() Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _ "<br><b>Error in: </b>" & Request.Url.ToString() & _ "<br><b>Error Message: </b>" & objErr.Message.ToString() & _ "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString() Response.Write(err.ToString()) Server.ClearError() End Sub </script>
В меню "Файл" нажмите кнопку "Сохранить PageEvent.aspx".
Щелкните правой кнопкой мыши страницу и нажмите кнопку "Вид " в браузере, чтобы запустить страницу. Обратите внимание, что ошибка возникает и сообщается в соответствии с спецификациями кода.
Примечание.
Вы можете заметить, что код выдает вызов Server.ClearError
. Это предотвращает продолжение обработки события ошибкой Application_Error
.
Использование события Application_Error
Page_Error
Как и в случае с событием, можно использовать Application_Error
событие для ловушки ошибок, возникающих в приложении. Из-за области приложения на уровне приложения можно записывать сведения об ошибках приложения или обрабатывать другие ошибки на уровне приложения, которые могут возникнуть.
Приведенный ниже пример основан на приведенном выше Page_Error
примере кода события и будет запущен, если ошибка в Page_Load
событии не была захвачена в событии Page_Error
. Событие Application_Error
указывается в файле Global.asax приложения. Для простоты действия в этом разделе создают новую страницу, в которой создается исключение, перехватывает ошибку в случае файла Global.asax и записывает ошибку в Application_Error
журнал событий. Ниже показано, как использовать Application_Error
событие:
Добавьте новый файл с именем AppEvent.aspx в проект.
Добавьте следующий код в AppEvent.aspx:
<script language=vb runat="server"> Sub Page_Load(Sender as object, e as EventArgs) throw(new ArgumentNullException()) End Sub </script>
В меню "Файл" нажмите кнопку "Сохранить AppEvent.aspx".
Application_Error
Добавьте событие в файл Global.asax, чтобы зафиксировать ошибку, которая возникает вPage_Load
случае AppEvent.aspx страницы. Обратите внимание, что необходимо добавить инструкциюImports
для пространства имен вSystem.Diagnostics
Global.asax, чтобы использовать журнал событий.Добавьте следующий код в файл Global.asax :
Imports System.Diagnostics Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Dim objErr As Exception = Server.GetLastError().GetBaseException() Dim err As String = "Error Caught in Application_Error event" & _ System.Environment.NewLine & _ "Error in: " & Request.Url.ToString() & _ System.Environment.NewLine & _ "Error Message: " & objErr.Message.ToString() & _ System.Environment.NewLine & _ "Stack Trace:" & objErr.StackTrace.ToString() EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error) Server.ClearError() additional actions... End Sub
Сохраните файл Global.asax .
В Visual Studio .NET в меню "Сборка" щелкните "Сборка".
Щелкните правой кнопкой мыши страницу и выберите команду "Вид " в браузере. В этом случае страница будет пуста, однако следует заметить, что в журнал событий добавлена новая запись. Этот пример делает запись в журнале приложений, которая доступна из Просмотр событий. После ведения журнала ошибки может потребоваться перенаправить пользователя на другую более удобную страницу ошибок или выполнить некоторые дополнительные действия при необходимости.
Использование файла конфигурации Web.config
Если вы не вызываете или не перехватываете Server.ClearError
ошибку в Page_Error
или Application_Error
событии, эта ошибка обрабатывается на основе параметров в <customErrors>
разделе файла web.config . <customErrors>
В разделе можно указать страницу перенаправления в качестве страницы ошибок по умолчанию илиdefaultRedirect
указать определенную страницу на основе кода ошибки протокола HTTP, который вызывается. Этот метод можно использовать для настройки сообщения об ошибке, которое получает пользователь.
Если возникает ошибка, которая не находится в ловушке ни на одном из предыдущих уровней в приложении, отображается эта пользовательская страница. В этом разделе показано, как изменить файл Global.asax , чтобы Server.ClearError
он никогда не вызывался. В результате ошибка обрабатывается в файле web.config в качестве последней точки, чтобы захватить ошибку.
Откройте файл Global.asax из предыдущего примера.
Server.ClearError
Закомментируйте строку, чтобы убедиться, что поверхности ошибок в файле web.config.Сохраните изменения в Global.asax. Теперь код должен выглядеть примерно так:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Dim objErr As Exception = Server.GetLastError().GetBaseException() Dim err As String = "Error Caught in Application_Error event" & _ System.Environment.NewLine & _ "Error in: " & Request.Url.ToString() & _ System.Environment.NewLine & _ "Error Message: " & objErr.Message.ToString() & _ System.Environment.NewLine & _ "Stack Trace:" & objErr.StackTrace.ToString() EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error) Server.ClearError() additional actions... End Sub
Добавьте следующий код в
<customErrors>
раздел, чтобы перенаправить пользователя на пользовательскую страницу:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> </customErrors>
Примечание.
Необходимо изменить путь к файлу в
defaultRedirect
атрибуте, чтобы он ссылается на соответствующие имена веб-сервера и приложений.Так как ошибки, которые находятся в ловушке на этом уровне, отправляются на страницу ошибок по умолчанию, необходимо создать страницу ошибок с именем ErrorStatus.htm. Имейте в виду, что этот метод используется для управления тем, что представляется пользователю, поэтому в этом примере используется страница .htm для страницы ошибки. Добавьте следующий код в ErrorStatus.htm:
<HTML> <HEAD> <TITLE></TITLE> <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0"> </HEAD> <BODY> <b>Custom Error page!</b> <br> You have been redirected here from the <customErrors> section of the Web.config file. </BODY> </HTML>
Чтобы проверить код, сохраните файлы, создайте проект и просмотрите AppEvent.aspx в браузере. Обратите внимание, что при возникновении ошибки вы перенаправляетесь на страницу ErrorStatus.htm . Хотя вы можете ссылаться на страницу ошибок по умолчанию в значении атрибута
defaultRedirect
в<customErrors>
разделе, можно также указать определенную страницу для перенаправления на основе кода ошибки HTTP, который вызывается. Дочерний<error>
элемент позволяет использовать этот параметр. Рассмотрим пример.<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> <error statusCode="404" redirect="filenotfound.htm"/> </customErrors>
Примечание.
Страница, указанная в defaultRedirect
<customErrors>
разделе, является файлом .htm . Если вы планируете использовать GetLastError
на странице .aspx (которые Page_Error
делают и Application_Error
примеры), необходимо сохранить исключение в переменной сеанса или другой подход, прежде чем будет выполняться перенаправление.
Обратите внимание, что раздел <customErrors>
содержит mode
атрибут, для которому задано значение On
. Атрибут mode
используется для управления тем, как происходит перенаправление ошибок. Например, если вы разрабатываете приложение, скорее всего, хотите просмотреть фактические сообщения об ошибках ASP.NET и не хотите перенаправляться на более удобную для пользователя страницу ошибок. Атрибут mode
включает следующие параметры:
On
: необработанные исключения перенаправляют пользователя на указаннуюdefaultRedirect
страницу. Этоmode
используется главным образом в рабочей среде.Off
: пользователи получают сведения об исключении и не перенаправляются на страницуdefaultRedirect
. Этоmode
используется главным образом в разработке.RemoteOnly
: только пользователи, обращающиеся к сайту на локальном компьютере (с помощью localhost), получают сведения об исключении. Все остальные пользователи перенаправляются на страницуdefaultRedirect
. Этот режим используется главным образом для отладки.
Устранение неполадок
В своей установке по умолчанию в Windows ASP.NET выполняет код веб-приложения в рабочем процессе. Удостоверение этого процесса по умолчанию является непривилегированной локальной учетной записью, называемой учетной записью ASPNET . В бета-версиях ASP.NET удостоверение процесса было системным, мощной административной учетной записью с множеством привилегий на компьютере.
В своей установке по умолчанию в Windows Server (IIS) ASP.NET запускает код веб-приложения в рабочем процессе. Удостоверение этого процесса по умолчанию используется для ограниченной учетной записи с именем NetworkService.
Дополнительные сведения об этом изменении и о том, как он может повлиять на выполнение кода в этой статье, а также другой код, который может потребовать дополнительных прав доступа, см . в шаблонах и рекомендациях