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

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

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

Введение

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

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

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

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

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

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

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

На рисунке 1 показана страница деталей исключения YSOD. Запишите URL-адрес в окне адреса браузера: http://localhost:62275/Genre.aspx?ID=foo Помните, что Genre.aspx на странице перечислены обзоры книг в определенном жанре. Для этого необходимо, чтобы значение GenreId (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 не содержит никаких сведений об ошибке
(Щелкните, чтобы просмотреть изображение полного размера)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<configuration>
    ...

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

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

Приведенная выше разметка настраивает приложение таким образом, что пользователи, посещающие его из локальной сети, видят страницу с деталями об ошибках YSOD, в то время как для пользователей, посещающих приложение удаленно, отображается пользовательская страница ошибок Oops.aspx. Чтобы увидеть это в действии, разверните веб-сайт в рабочей среде, а затем посетите страницу Genre.aspx на динамическом сайте с недопустимым значением запроса. Вы увидите пользовательскую страницу ошибок (см. рисунок 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.

Скриншот, на котором показано, как среда выполнения .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 Error Pages, One More Time", чтобы получить рекомендации по созданию эффективных страниц ошибок 404.

Снимок экрана: настраиваемая страница ошибки 4 O 4.

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

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

Замечание

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

Сводка

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

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

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

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

Дальнейшее чтение

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