Создание настраиваемых страниц отчетов об ошибках в ASP.NET с помощью Visual Basic .NET
В этой статье описывается, как использовать код .NET Microsoft Visual Basic для перехвата ошибок и реагирования на них при их возникновении в 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, объект используется для ASPError
создания настраиваемой страницы отчетов об ошибках. Однако эти подходы имеют свои ограничения.
ASP.NET предоставляет несколько уровней, на которых можно обрабатывать ошибки, возникающие при запуске приложения ASP.NET, и реагировать на них. ASP.NET предоставляет три метода main, которые позволяют перехватывать ошибки и реагировать на них при их возникновении: 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 приложения. Для простоты действия, описанные в этом разделе, создают новую страницу, на которой создается исключение, перехватывают ошибку в Application_Error
случае файла Global.asax и записывают ошибку в журнал событий. Ниже показано, как использовать 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.
Дополнительные сведения об этом изменении и о том, как оно может влиять на выполнение кода в этой статье, а также о другом коде, который может потребовать дополнительных прав доступа, см. в статье Шаблоны & методики
Ссылки
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по