Как бы я подключил / заменил YSOD «конечного пользователя»? - PullRequest
1 голос
/ 08 февраля 2010

Я хочу отобразить YSOD, когда он будет предоставлять полезную информацию во время разработки или локально на серверах, а в других случаях - полуграничную страницу. Я знаю, что мог бы установить атрибут defaultRedirect тега конфигурации приложения <customErrors> в web.config, но я бы предпочел выполнить некоторую обработку, чтобы сгенерировать страницу с немного лучшей информацией.

Все мои контроллеры наследуются от одного центрального класса BaseController, где я переопределил OnException (по сути, вот так):

protected override void OnException(ExceptionContext filterContext) {
    //if something really bad happened and we get inside this if, 
    //just let the YSOD appear because there isn't anything we can do
    if (filterContext == null)
        return; 

    LogException(filterContext.Exception);

    //insert answer for question here:
    if (FigureOutIfDetailedYsodWouldBeDisplayed(filterContext)) 
        return;

    //what to actually do for end users
    filterContext.ExceptionHandled = true;
    filterContext.Result = View("ErrorPage", GetErrorModel(filterContext));
}

Как мне реализовать FigureOutIfDetailedYsodWouldBeDisplayed (ответом не должен быть код, указатель в правильном направлении будет просто в порядке)? Моя текущая реализация проверяет необработанный URL-адрес на наличие "// localhost", но это решение кажется неуклюжим и не работает все время (например, если у разработчика есть запись хоста для ввода чего-то другого, кроме localhost: приложение раньше было).

Ответы [ 2 ]

2 голосов
/ 08 февраля 2010

Знаете ли вы, что вы также можете добавить собственные страницы ошибок для каждого кода ошибки HTTP? Вам действительно нужен этот специальный код для обработки ошибок?

  <customErrors mode="RemoteOnly" defaultRedirect="Error/Default">
    <error statusCode="401" redirect="Error/AccessDenied" />
    <error statusCode="404" redirect="Error/NotFound" />
  </customErrors>

Кроме того, если у вас нет особых потребностей, я бы не советовал писать этот код регистрации исключений самостоятельно. Сделайте себе одолжение и проверьте ELMAH . Шутки в сторону. [Отказ от ответственности: я не участвую в этом проекте, просто очень счастливый пользователь]

Все, что нужно - это (буквально!) Несколько строк в вашем web.config, сбросить dll в папку bin и (если вы хотите войти в БД) один скрипт .sql.

Со страницы проекта :

"ELMAH (Модули и обработчики журнала ошибок) - это полностью подключаемое средство регистрации ошибок в масштабах всего приложения. Его можно динамически добавлять в работающее веб-приложение ASP.NET или даже во все веб-приложения ASP.NET на компьютере. без необходимости повторной компиляции или повторного развертывания.

Как только ELMAH будет добавлен в работающее веб-приложение и настроен соответствующим образом, вы получите следующие возможности, не меняя ни одной строки своего кода:

  • Регистрация почти всех необработанных исключений.
  • Веб-страница для удаленного просмотра всего журнала перекодированных исключений.
  • Веб-страница для удаленного просмотра полной информации о любом зарегистрированном исключении.
  • Во многих случаях вы можете просмотреть исходный желтый экран смерти, сгенерированный ASP.NET - для данного исключения, даже с отключенным режимом customErrors.
  • Уведомление по электронной почте о каждой ошибке во время ее возникновения. "
0 голосов
/ 08 февраля 2010

Если вы действительно строите с использованием параметра Debug для сред разработки и Release для производственных сред, вы всегда можете просто сделать

#if DEBUG
    //Show YSOD
#else
    //Show friendly error page
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...