Создание настраиваемых страниц отчетов об ошибках в 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 событие.

  1. Чтобы добавить в проект новый файл с именем PageEvent.aspx , выполните следующие действия.

    1. Откройте Visual Studio .NET.
    2. В Обозреватель решений щелкните правой кнопкой мыши узел проекта, наведите указатель мыши на пункт Добавить и выберите команду Добавить веб-форму.
    3. В текстовом поле Имя введите PageEvent.aspx и нажмите кнопку Открыть.
  2. Добавьте следующий код в 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>
    
  3. В меню Файл выберите команду СохранитьPageEvent.aspx.

  4. Щелкните правой кнопкой мыши страницу и выберите пункт Просмотр в браузере, чтобы запустить страницу. Обратите внимание, что ошибка возникает и сообщается в соответствии со спецификациями кода.

Примечание.

Вы можете заметить, что код выдает вызов .Server.ClearError Это предотвращает продолжение ошибки до события, Application_Error которое будет обрабатываться.

Использование события Application_Error

Как и в случае с событием Page_ErrorApplication_Error , событие можно использовать для ловли ошибок, возникающих в приложении. Из-за область события в масштабах всего приложения можно регистрировать сведения об ошибках приложения или обрабатывать другие ошибки на уровне приложения, которые могут возникнуть.

Пример для выполнения основан на предыдущем Page_Error примере кода события и будет запущен, если ошибка в событии Page_Load не была захвачена в событии Page_Error . Событие Application_Error указывается в файле Global.asax приложения. Для простоты действия, описанные в этом разделе, создают новую страницу, на которой создается исключение, перехватывают ошибку в Application_Error случае файла Global.asax и записывают ошибку в журнал событий. Ниже показано, как использовать Application_Error событие.

  1. Добавьте в проект новый файл с именем AppEvent.aspx .

  2. Добавьте следующий код в AppEvent.aspx:

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. В меню Файл выберите команду СохранитьAppEvent.aspx.

  4. 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
    
  5. Сохраните файл Global.asax .

  6. В Visual Studio .NET в меню Сборка щелкните Сборка.

  7. Щелкните страницу правой кнопкой мыши и выберите пункт Вид в браузере. В этом случае страница будет пустой, однако следует заметить, что в журнал событий добавлена новая запись. В этом примере в журнале приложений создается запись, доступная из Просмотр событий. После регистрации ошибки может потребоваться перенаправить пользователя на другую более удобную страницу ошибок или выполнить некоторые дополнительные действия при необходимости.

Использование файла Web.config

Если вы не вызываете или не перехватываете Server.ClearError ошибку в Page_Error событии или Application_Error , ошибка обрабатывается на основе параметров в <customErrors> разделе файлаWeb.config . <customErrors> В этом разделе можно указать страницу перенаправления в качестве страницы ошибок по умолчанию (defaultRedirect) или указать для определенной страницы на основе возникающего кода ошибки HTTP. Этот метод можно использовать для настройки сообщения об ошибке, которое получает пользователь.

Если возникает ошибка, которая не задерживается ни на одном из предыдущих уровней в приложении, отображается эта пользовательская страница. В этом разделе показано, как изменить файл Global.asax так, чтобы Server.ClearError он никогда не вызывался. В результате ошибка обрабатывается в файлеWeb.config в качестве последней точки для перехвата ошибки.

  1. Откройте файл Global.asax из предыдущего примера.

  2. Закомментируйте Server.ClearError строку, чтобы убедиться, что ошибка отображается в файлеWeb.config .

  3. Сохраните изменения в 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
    
  4. Добавьте следующий код в раздел, <customErrors> чтобы перенаправить пользователя на настраиваемую страницу:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Примечание.

    Необходимо изменить путь к файлу в defaultRedirect атрибуте , чтобы он ссылались на соответствующие имена веб-сервера и приложений.

  5. Так как ошибки, захваченные на этом уровне, отправляются на страницу ошибок по умолчанию, необходимо создать страницу ошибки с именем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>
    
  6. Чтобы протестировать код, сохраните файлы, выполните сборку проекта, а затем просмотрите 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_ErrorApplication_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.

Дополнительные сведения об этом изменении и о том, как оно может влиять на выполнение кода в этой статье, а также о другом коде, который может потребовать дополнительных прав доступа, см. в статье Шаблоны & методики

Ссылки