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