Пользовательская обработка ошибок в DNN 7?

Кто-нибудь здесь имеет опыт пользовательской обработки ошибок внутри DNN 7?

Встроенное ведение журнала в порядке, но моей компании необходимо расширить встроенную обработку ошибок DNN, чтобы включить отправку настраиваемых электронных писем при ВСЕХ исключениях. Мы создали модуль HttpModule, добавивший прослушиватель событий в Application_Error, и отправляем исключения по электронной почте. Однако после отправки электронного сообщения об исключении мы не перенаправляемся на указанную страницу 500 Error, установленную в свойствах DNN в разделе Admin > Настройки сайта. У нас разное поведение в зависимости от типа исключения. Некоторые исключения (NullReferenceException) приводят к запуску Application_Error и отправке электронной почты, но без перенаправления, другие (HttpException) приводят к перенаправлению на страницу 500 без запуска события Application_Error. Возможно ли, что что-то в DNN перехватывает эти ошибки до того, как сработает Application_Error, и есть какие-либо идеи о том, как исправить эти проблемы?

Вот httpModule, который мы добавили в web.config:

    /// /// Класс для обработки ошибок и отправки исключений по электронной почте в список рассылки ошибок. /// открытый класс ErrorModule: IHttpModule {

        #region Private Properties

        /// 
        /// Получает запрошенный URL.
        /// 
        /// Запрошенный URL. закрытая строка requiredUrl {
            get {
                //TODO: создать CmsPathTranslationFactory для создания объекта ICmsPathTranslator для получения запрошенного пути URL-адреса return!string.IsNullOrEmpty(HttpContext.Current.Items["UrlRewrite:OriginalUrl"].ToString())? новый Uri(HttpContext.Current.Items["UrlRewrite:OriginalUrl"].ToString()).AbsolutePath: HttpContext.Current.Request.Url.AbsolutePath;
            }
        }

        #endregion

        #region Члены IHttpModule /// /// Инициализирует указанное приложение. /// /// Приложение. public void Init(приложение HttpApplication) {
            application.Error += new EventHandler(application_Error);
        }

        /// 
        /// Удаляет ресурсы (кроме памяти), используемые модулем, который реализует.
        /// 
        public void Dispose() { }

        #endregion

        #region Открытые методы /// /// Обрабатывает событие Error элемента управления приложения. /// /// Источник события. /// Экземпляр, содержащий данные события. public void application_Error(отправитель объекта, EventArgs e) {
            HttpApplication application = (HttpApplication) отправитель;

            // получаем последнее исключение Exception exception = application.Server.GetLastError();

            if (исключение == ноль) {
                // исключение - ноль, отправлять нечего sendErrorMessage(new Exception("Exception is null.")); вернуть; } // получить внутреннее исключение, если оно не равно нулю if (exception.InnerException!= null) {
                exception = exception.InnerException;
            }

            if (исключение - исключение HttpException && ((HttpException)).GetHttpCode() == 404) {
                // не отправлять сообщение об исключении для 404
            }
            else {
                sendErrorMessage(исключение);
            }
        }

        #endregion

        #region Private Methods

        /// 
        /// Отправляет сообщение электронной почты с указанной ошибкой. /// /// Исключение.
        private void sendErrorMessage(Exception ex) {
            using (MailMessage message = new MailMessage()) {
                message.To.Add(new MailAddress(ConfigurationManager.AppSettings["errorEmailToAddress"]));
                message.ReplyToList.Add(new MailAddress(ConfigurationManager.AppSettings["errorEmailReplyToAddress"]));
                message.From = новый MailAddress(ConfigurationManager.AppSettings["errorEmailFromAddress"], Environment.MachineName);
                message.Subject = getErrorEmailSubject(ex, requiredUrl);
                message.Body = ex.ToString();
                message.Priority = MailPriority.High;

                using (SmtpClient client = new SmtpClient()) {
                    client.Host = ConfigurationManager.AppSettings["SMTPServer"];
                    client.Send(сообщение);
                }
            }
        }

        /// 
        /// Получает тему сообщения об ошибке на основе указанного исключения. /// /// Экс. /// Запрошенный путь URL.
        /// System.String. приватная строка getErrorEmailSubject(Exception ex, string requiredPath) {
            return!string.IsNullOrEmpty(ex.Message)? string.Concat(requiredPath, " - ", ex.Message): requiredPath;
        }

        #endregion

    }

1 ответ

DNN может отправлять электронные письма уже для каждого исключения. Вы можете настроить все это в журнале событий, редактируя типы событий и настраивая параметры электронной почты.

Другие вопросы по тегам