Отображение страницы пользовательской ошибки (C#)

Скотт Митчелл

Что видит пользователь при возникновении ошибки среды выполнения в веб-приложении ASP.NET? Ответ зависит от конфигурации customErrors> веб-сайта<. По умолчанию пользователям отображается неприглядный желтый экран с сообщением об ошибке времени выполнения. В этом руководстве показано, как настроить эти параметры для отображения эстетически приятной пользовательской страницы ошибок, которая соответствует интерфейсу вашего сайта.

Введение

В идеальном мире не было бы ошибок во время выполнения. Программисты будут писать код с ошибкой Nary и надежной проверкой ввода пользователем, а внешние ресурсы, такие как серверы баз данных и серверы электронной почты, никогда не переходят в автономный режим. Конечно, в реальности ошибки неизбежны. Классы в платформа .NET Framework сигнализируют об ошибке, вызывая исключение. Например, вызов метода Open объекта SqlConnection устанавливает соединение с базой данных, указанной строкой подключения. Однако если база данных не работает или учетные данные в строке подключения недопустимы, метод Open вызывает исключение SqlException. Исключения можно обрабатывать с помощью try/catch/finally блоков. Если код в блоке try создает исключение, управление передается в соответствующий блок catch, где разработчик может попытаться восстановить ошибку. Если соответствующий блок catch отсутствует или код, вызвавший исключение, не находится в блоке try, исключение перебирает стек вызовов в поисках try/catch/finally блоков.

Если исключение выполняется вплоть до среды выполнения ASP.NET без обработки, HttpApplicationвозникает событие класса Error и отображается настроенная страница ошибки. По умолчанию ASP.NET отображает страницу ошибки, которая называется желтым экраном смерти (YSOD). Существует две версии YSOD: в одной отображаются сведения об исключении, трассировка стека и другая информация, полезная для разработчиков, отлаживающих приложение (см . рис. 1); другой просто указывает, что произошла ошибка во время выполнения (см . рис. 2).

Сведения об исключении YSOD весьма полезны для разработчиков, отлаживающих приложение, но отображение YSOD для конечных пользователей является липким и непрофессиональным. Вместо этого конечных пользователей следует перейти на страницу ошибок, которая поддерживает внешний вид сайта с более удобной прозаи, описывающей ситуацию. Хорошей новостью является то, что создать такую пользовательскую страницу ошибок довольно просто. Это руководство начинается с работы с ASP. NET — разные страницы ошибок. Затем в нем показано, как настроить веб-приложение для отображения пользователям настраиваемой страницы ошибок перед лицом ошибки.

Изучение трех типов страниц ошибок

При возникновении необработанного исключения в приложении ASP.NET отображается один из трех типов страниц ошибок:

  • Страница Сведений об исключении Желтый экран ошибки смерти,
  • Страница "Желтый экран ошибки времени выполнения" со сведениями об ошибке смерти или
  • Пользовательская страница ошибок

Страница ошибок, с которыми чаще всего знакомы разработчики, — это сведения об исключении YSOD. По умолчанию эта страница отображается для пользователей, которые посещают локально, и поэтому является страницей, которая отображается при возникновении ошибки при тестировании сайта в среде разработки. Как следует из названия, YSOD сведений об исключении предоставляет сведения об исключении — тип, сообщение и трассировку стека. Более того, если исключение было вызвано кодом в классе кода программной части страницы ASP.NET и приложение настроено для отладки, то в YSOD сведений об исключении также будет отображаться эта строка кода (и несколько строк кода выше и под ней).

На рис. 1 показана страница сведения об исключении YSOD. Запишите URL-адрес в окне адреса браузера: http://localhost:62275/Genre.aspx?ID=foo. Напомним, что на Genre.aspx странице перечислены рецензии на книги в определенном жанре. Для этого требуется, чтобы GenreId значение (a uniqueidentifier) было передано через строку запроса; например, соответствующий URL-адрес для просмотра проверок художественной литературы — Genre.aspx?ID=7683ab5d-4589-4f03-a139-1c26044d0146. Если значение, отличноеuniqueidentifier от , передается через строку запроса (например, foo), возникает исключение.

Примечание

Чтобы воспроизвести эту ошибку в демонстрационном веб-приложении, доступном для скачивания, перейдите Genre.aspx?ID=foo напрямую или щелкните ссылку "Создать ошибку среды выполнения" в Default.aspx.

Обратите внимание на сведения об исключении, представленные на рис. 1. В верхней части страницы отображается сообщение об исключении "Сбой преобразования из строки символов в uniqueidentifier". Также указан тип исключения System.Data.SqlClient.SqlException, . Существует также трассировка стека.

Снимок экрана: сведения об исключении YSOD, включающие сведения об исключении.

Рис. 1. Сведения об исключении YSOD включают сведения об исключении
(Щелкните для просмотра полноразмерного изображения)

Другим типом YSOD является ошибка времени выполнения YSOD, показанная на рис. 2. Ошибка времени выполнения YSOD сообщает посетителю о том, что произошла ошибка во время выполнения, но не содержит никаких сведений о созданном исключении. (Однако он предоставляет инструкции по просмотру сведений об ошибке путем изменения Web.config файла, что является частью того, что делает такой YSOD выглядеть непрофессионально.)

По умолчанию ошибка времени выполнения YSOD отображается для пользователей, посещающих удаленно (через http://www.yoursite.com), о чем свидетельствует URL-адрес в адресной строке браузера на рис. 2: http://httpruntime.web703.discountasp.net/Genre.aspx?ID=foo. Два разных экрана YSOD существуют, потому что разработчики заинтересованы в том, чтобы узнать подробности об ошибке, но такая информация не должна отображаться на активном сайте, так как она может выявить потенциальные уязвимости системы безопасности или другую конфиденциальную информацию для всех, кто посещает ваш сайт.

Примечание

Если вы следите за этим и используете DiscountASP.NET в качестве веб-узла, вы можете заметить, что ошибка времени выполнения YSOD не отображается при посещении активного сайта. Это связано с тем, что серверы DiscountASP.NET настроены для отображения YSOD сведений об исключении по умолчанию. Хорошей новостью является то, что вы можете переопределить это поведение по умолчанию, <customErrors> добавив раздел в Web.config файл. В разделе "Настройка отображаемой страницы ошибки" подробно рассматривается этот <customErrors> раздел.

Снимок экрана: ошибка времени выполнения YSOD не содержит сведений об ошибке.

Рис. 2. Ошибка времени выполнения YSOD не содержит сведений об ошибке
(Щелкните для просмотра полноразмерного изображения)

Третий тип страницы ошибок — это пользовательская страница ошибок, которая представляет собой созданную вами веб-страницу. Преимущество настраиваемой страницы ошибок заключается в том, что у вас есть полный контроль над информацией, которая отображается пользователю, а также ее внешний вид. Пользовательская страница ошибок может использовать те же master страницы и стилей, что и другие страницы. В разделе "Использование пользовательской страницы ошибок" описано, как создать пользовательскую страницу ошибок и настроить ее для отображения в случае необработанного исключения. На рисунке 3 показан пиковая загрузка этой настраиваемой страницы ошибок. Как видите, внешний вид страницы ошибки гораздо более профессионально выглядит, чем любой из желтых экранов смерти, показанных на рисунках 1 и 2.

Снимок экрана, на котором показана пользовательская страница ошибок, демонстрирующая более индивидуальный внешний вид.

Рис. 3. Пользовательская страница ошибок предлагает более адаптированный внешний вид
(Щелкните для просмотра полноразмерного изображения)

Проверьте адресную строку браузера на рис. 3. Обратите внимание, что в адресной строке отображается URL-адрес настраиваемой страницы ошибок (/ErrorPages/Oops.aspx). На рисунках 1 и 2 желтые экраны смерти показаны на той же странице, с которой возникла ошибка (Genre.aspx). Настраиваемой странице ошибок передается URL-адрес страницы, на которой произошла ошибка, с помощью aspxerrorpath параметра querystring.

Настройка отображаемой страницы ошибок

Какая из трех возможных страниц ошибок отображается на основе двух переменных:

  • Сведения о конфигурации <customErrors> в разделе и
  • Указывает, посещает ли пользователь сайт локально или удаленно.

Раздел<customErrors> в Web.config содержит два атрибута, влияющие на отображаемую страницу ошибки: defaultRedirect и mode. Атрибут defaultRedirect является необязательным. Если он указан, он указывает URL-адрес настраиваемой страницы ошибок и указывает, что пользовательская страница ошибок должна отображаться вместо ошибки времени выполнения YSOD. Атрибут mode является обязательным и принимает одно из трех значений: On, Offили RemoteOnly. Эти значения имеют следующее поведение:

  • On — указывает, что пользовательская страница ошибок или ошибка времени выполнения YSOD отображается для всех посетителей, независимо от того, являются ли они локальными или удаленными.
  • Off — указывает, что YSOD сведений об исключении отображается для всех посетителей, независимо от того, являются ли они локальными или удаленными.
  • RemoteOnly — указывает, что пользовательская страница ошибок или ошибка времени выполнения YSOD отображается для удаленных посетителей, а сведения об исключении YSOD отображаются для местных посетителей.

Если не указано иное, ASP.NET действует так, как если бы для атрибута mode было задано значение RemoteOnly и значение не задано defaultRedirect . Другими словами, поведение по умолчанию заключается в том, что сведения об исключении YSOD отображаются для местных посетителей, а ошибка времени выполнения YSOD отображается для удаленных посетителей. Это поведение по умолчанию можно переопределить, добавив <customErrors> раздел в веб-приложение. Web.config file.

Использование пользовательской страницы ошибок

Каждое веб-приложение должно иметь пользовательскую страницу ошибок. Он предоставляет более профессионально выглядящий альтернативу YSOD ошибки времени выполнения, его легко создать, а настройка приложения для использования настраиваемой страницы ошибок занимает всего несколько секунд. Первым шагом является создание настраиваемой страницы ошибок. Я добавил новую папку в приложение Book Reviews с именем ErrorPages и добавил в нее новую страницу ASP.NET с именем Oops.aspx. Укажите для страницы ту же master страницу, что и остальные страницы сайта, чтобы она автоматически наследовала тот же внешний вид.

Снимок экрана, на котором выделена новая папка ErrorPages и связанный файл Oops.

Рис. 4. Создание пользовательской страницы ошибок

Затем потратьте несколько минут на создание содержимого для страницы ошибки. Я создал довольно простую пользовательскую страницу ошибок с сообщением о том, что произошла непредвиденная ошибка и ссылка на домашнюю страницу сайта.

Снимок экрана: страница пользовательской ошибки и связанное с ней сообщение.

Рис. 5. Разработка настраиваемой страницы ошибок
(Щелкните для просмотра полноразмерного изображения)

После завершения страницы ошибок настройте веб-приложение для использования настраиваемой страницы ошибок вместо YSOD ошибки среды выполнения. Для этого нужно указать URL-адрес страницы ошибки в <customErrors> атрибуте defaultRedirect раздела. Добавьте следующую разметку в файл приложения Web.config :

<configuration>
    ...

    <system.web>
        <customErrors mode="RemoteOnly"
                      defaultRedirect="~/ErrorPages/Oops.aspx" />

        ...
    </system.web>
</configuration>

Приведенная выше разметка настраивает приложение для отображения сведений об исключениях для пользователей, посещающих локально, при этом используется пользовательская страница ошибок Oops.aspx для пользователей, посещающих удаленно. Чтобы увидеть это в действии, разверните веб-сайт в рабочей среде, а затем перейдите на страницу Genre.aspx на динамическом сайте с недопустимым значением querystring. Вы увидите страницу пользовательской ошибки (см. рис. 3).

Чтобы убедиться, что пользовательская страница ошибки отображается только для удаленных пользователей, перейдите на страницу Genre.aspx с недопустимой строками запросов из среды разработки. Вы по-прежнему должны видеть сведения об исключении YSOD (см. рис. 1). Этот RemoteOnly параметр гарантирует, что пользователи, посещающие сайт в рабочей среде, увидят пользовательскую страницу ошибок, а разработчики, работающие локально, продолжают видеть сведения об исключении.

Уведомление разработчиков и сведения об ошибках ведения журнала

Ошибки, возникающие в среде разработки, были вызваны тем, что разработчик сидел за компьютером. Ей отображаются сведения об исключении в разделе Сведения об исключении YSOD, и ей известно, какие действия она выполняла при возникновении ошибки. Но при возникновении ошибки в рабочей среде разработчик не знает, что произошла ошибка, если пользователю, посещающим сайт, потребуется время, чтобы сообщить об этой ошибке. И даже если пользователь изо всех способов оповещает группу разработчиков о возникновении ошибки, не зная тип исключения, сообщение и трассировку стека, может быть трудно определить причину ошибки, не говоря уже о ее исправлении.

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

Использование разных пользовательских страниц ошибок для различных состояний ошибок HTTP

Если исключение создается ASP.NET страницей и не обрабатывается, исключение перебирается в среду выполнения ASP.NET, на которой отображается настроенная страница ошибки. Если запрос поступает в подсистему ASP.NET, но не может быть обработан по какой-либо причине (возможно, запрошенный файл не найден или разрешения на чтение для файла отключены), то подсистема ASP.NET вызывает исключение HttpException. Это исключение, как и исключения, возникающие из ASP.NET страниц, выполняется до среды выполнения, что приводит к отображению соответствующей страницы ошибки.

Это означает для веб-приложения в рабочей среде, что если пользователь запрашивает страницу, которая не найдена, он увидит пользовательскую страницу ошибки. На рисунке 6 показан такой пример. Так как запрос предназначен для несуществующей страницы (NoSuchPage.aspx), HttpException создается исключение и отображается пользовательская страница ошибки (обратите внимание на ссылку NoSuchPage.aspx на в параметре aspxerrorpath querystring).

Снимок экрана, на котором показано, как среда выполнения A P dot NET отображает настроенную страницу ошибки.

Рис. 6. Среда выполнения ASP.NET отображает настроенную страницу ошибки в ответ на недопустимый запрос (щелкните для просмотра полноразмерного изображения)

По умолчанию все типы ошибок приводят к отображению одной и той же пользовательской страницы ошибок. Однако можно указать другую настраиваемую страницу ошибки для определенного кода состояния HTTP, используя <error> дочерние <customErrors> элементы в разделе. Например, чтобы в случае ошибки "Страница не найдена" отображалась другая страница ошибки с кодом состояния HTTP 404, обновите <customErrors> раздел, включив следующую разметку:

<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/Oops.aspx">
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
</customErrors>

При таком изменении каждый раз, когда пользователь удаленно запрашивает ресурс ASP.NET, который не существует, он будет перенаправляться на 404.aspx пользовательскую страницу ошибок вместо Oops.aspx. Как показано на рисунке 7 , страница 404.aspx может содержать более конкретное сообщение, чем общая пользовательская страница ошибки.

Примечание

Ознакомьтесь с 404 страницами ошибок еще раз, чтобы получить рекомендации по созданию действующих страниц ошибок 404.

Снимок экрана: страница пользовательской ошибки

Рис. 7. На странице пользовательской ошибки 404 отображается более целевое сообщение, чем Oops.aspx
(Щелкните для просмотра полноразмерного изображения)

Так как вы знаете, что 404.aspx страница доступна только тогда, когда пользователь отправляет запрос на страницу, которая не была найдена, вы можете улучшить эту настраиваемую страницу ошибок, чтобы включить функциональные возможности, которые помогут пользователю устранить эту ошибку конкретного типа. Например, можно создать таблицу базы данных, которая сопоставляет известные недопустимые URL-адреса с хорошими URL-адресами, а затем настроить 404.aspx пользовательскую страницу ошибок выполнить запрос к этой таблице и предложить страницы, к которым пользователь может получить доступ.

Примечание

Пользовательская страница ошибок отображается только в том случае, если выполняется запрос к ресурсу, обрабатываемый подсистемой ASP.NET. Как мы говорили в руководстве по основным различиям между IIS и сервером разработки ASP.NET , веб-сервер может обрабатывать определенные запросы самостоятельно. По умолчанию веб-сервер IIS обрабатывает запросы на статическое содержимое, например изображения и HTML-файлы, без вызова подсистемы ASP.NET. Следовательно, если пользователь запрашивает несуществующий файл изображения, он получит сообщение об ошибке IIS по умолчанию 404, а не ASP. Страница ошибки настройки NET.

Итоги

Когда в приложении ASP.NET возникает необработанное исключение, пользователю отображается одна из трех страниц ошибок: сведения об исключении Желтый экран смерти; Ошибка среды выполнения Желтый экран смерти; или настраиваемую страницу ошибок. Какая страница ошибки отображается, зависит от конфигурации приложения <customErrors> и от того, посещает ли пользователь локально или удаленно. Поведение по умолчанию заключается в том, чтобы показать сведения об исключении YSOD для местных посетителей и ошибку времени выполнения YSOD для удаленных посетителей.

Хотя ошибка времени выполнения YSOD скрывает потенциально конфиденциальные сведения об ошибках от пользователя, посещаемого сайтом, он ломается от внешнего вида вашего сайта и делает ваше приложение похожим. Лучшим подходом является использование настраиваемой страницы ошибок, которая предполагает создание и проектирование настраиваемой страницы ошибок и указание ее URL-адреса в <customErrors> атрибуте defaultRedirect раздела. Вы даже можете иметь несколько пользовательских страниц ошибок для различных состояний ошибок HTTP.

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

Счастливого программирования!

Дополнительные материалы

Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах: