1

这里的任何人都有在 DNN 7 中进行自定义错误处理的经验吗?

内置日志记录很好,但我的公司需要扩展 DNN 的内置错误处理,包括在ALL时发送自定义电子邮件发生异常。我们创建了一个 HttpModule,它在 Application_Error 上添加了一个事件侦听器,并且一直以这种方式通过电子邮件发送异常。但是,在通过电子邮件发送异常后,我们不会始终被重定向到 DNN 属性中“管理”>“站点设置”下设置的指定 500 错误页面。根据异常类型,我们有不同的行为。一些异常 (NullReferenceException) 导致 Application_Error 触发并发送电子邮件但没有重定向,其他 (HttpException) 导致重定向到 500 页面而不触发 Application_Error 事件。DNN 中是否有可能在 Application_Error 触发之前捕获这些错误,以及有关如何解决这些问题的任何想法?

这是我们添加到 web.config 中的 httpModule:

    ///
    /// 用于错误处理和通过电子邮件将异常发送到错误分发列表的类。
    ///
    公共类 ErrorModule : IHttpModule {

        #region 私有属性

        ///
        /// 获取请求的 URL。
        ///
        /// 请求的 URL。
        私有字符串请求的Url {
            得到 {
                //TODO: 创建 CmsPathTranslationFactory 以创建 ICmsPathTranslator 对象以获取请求的 URL 路径
                返回 !string.IsNullOrEmpty(HttpContext.Current.Items["UrlRewrite:OriginalUrl"].ToString()) ?
                    新的 Uri(HttpContext.Current.Items["UrlRewrite:OriginalUrl"].ToString()).AbsolutePath : HttpContext.Current.Request.Url.AbsolutePath;
            }
        }

        #endregion

        #region IHttpModule 成员

        ///
        /// 初始化指定的应用程序。
        ///
        /// 应用程序。
        公共无效初始化(HttpApplication应用程序){
            application.Error += new EventHandler(application_Error);
        }

        ///
        /// 释放实现 .
        ///
        公共无效处置(){}

        #endregion

        #region 公共方法

        ///
        /// 处理应用程序控件的错误事件。
        ///
        /// 事件的来源。
        /// 包含事件数据的实例。
        public void application_Error(object sender, EventArgs e) {
            HttpApplication 应用程序 = (HttpApplication) 发送者;

            // 获取最后一个异常
            异常异常 = application.Server.GetLastError();

            如果(异常 == null){
                // 异常为空,不发送
                sendErrorMessage(new Exception("异常为空。"));
                返回;
            }

            // 如果不为null,则获取内部异常
            if (exception.InnerException != null) {
                异常=异常。内部异常;
            }

            if (异常是 HttpException && ((HttpException)exception).GetHttpCode() == 404) {
                //不发送 404 异常邮件
            }
            别的 {
                发送错误消息(异常);
            }
        }

        #endregion

        #region 私有方法

        ///
        /// 发送带有指定错误的电子邮件。
        ///
        /// 异常。
        私人无效发送错误消息(异常前){
            使用 (MailMessage 消息 = 新 MailMessage()) {
                message.To.Add(new MailAddress(ConfigurationManager.AppSettings["errorEmailToAddress"]));
                message.ReplyToList.Add(new MailAddress(ConfigurationManager.AppSettings["errorEmailReplyToAddress"]));
                message.From = new MailAddress(ConfigurationManager.AppSettings["errorEmailFromAddress"], Environment.MachineName);
                message.Subject = getErrorEmailSubject(ex, requestedUrl);
                message.Body = ex.ToString();
                message.Priority = MailPriority.High;

                使用 (SmtpClient 客户端 = 新 SmtpClient()) {
                    client.Host = ConfigurationManager.AppSettings["SMTPServer"];
                    客户端.发送(消息);
                }
            }
        }

        ///
        /// 根据指定异常获取错误邮件主题。
        ///
        /// 前任
        /// 请求的 URL 路径。
        /// 系统字符串。
        私人字符串 getErrorEmailSubject(异常前,字符串请求路径){
            返回 !string.IsNullOrEmpty(ex.Message) ?string.Concat(requestedPath, " - ", ex.Message) : requestedPath;
        }

        #endregion

    }
4

1 回答 1

0

DNN 已经可以为每个异常发送电子邮件。您可以在事件日志中设置所有这些,编辑事件类型并配置电子邮件选项。

于 2014-09-10T22:46:55.017 回答