Поделиться через


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

  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_Error Как и в случае с событием, можно использовать Application_Error событие для ловушки ошибок, возникающих в приложении. Из-за области приложения на уровне приложения можно записывать сведения об ошибках приложения или обрабатывать другие ошибки на уровне приложения, которые могут возникнуть.

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

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

Ссылки