1

DNN 7 内でのカスタム エラー処理の経験がある人はいますか?

組み込みのログは問題ありませんが、私の会社では DNN の組み込みのエラー処理を拡張して、ALLの場合にカスタム メールを送信する必要があります。例外が発生します。Application_Error にイベント リスナーを追加する HttpModule を作成し、その方法で例外を電子メールで送信しています。ただし、例外が電子メールで送信された後、DNN の [管理] > [サイト設定] のプロパティで設定された指定の 500 エラー ページに一貫してリダイレクトされません。例外の種類によって動作が異なります。一部の例外 (NullReferenceException) では Application_Error が発生し、電子メールは送信されますがリダイレクトは行われません。他の例外 (HttpException) では、Application_Error イベントが発生せずに 500 ページにリダイレクトされます。Application_Error が発生する前に DNN の何かがこれらのエラーをキャッチしている可能性はありますか?また、これらの問題を修正する方法についてのアイデアはありますか?

web.config に追加した httpModule は次のとおりです。

    ///
    /// エラーを処理し、エラー配布リストに例外を電子メールで送信するためのクラス。
    ///
    public class ErrorModule : IHttpModule {

        #region プライベート プロパティ

        ///
        /// 要求された URL を取得します。
        ///
        /// 要求された URL。
        プライベート文字列 requestedUrl {
            得る {
                //TODO: CmsPathTranslationFactory を作成して、要求された URL パスを取得するための ICmsPathTranslator オブジェクトを作成します
                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 パブリック メソッド

        ///
        /// アプリケーション コントロールのエラー イベントを処理します。
        ///
        /// イベントのソース。
        /// イベント データを含むインスタンス。
        public void application_Error(オブジェクト送信者, EventArgs e) {
            HttpApplication アプリケーション = (HttpApplication) 送信者;

            // 最後の例外を取得
            例外 exception = application.Server.GetLastError();

            if (例外 == null) {
                // 例外は null です。送信するものはありません
                sendErrorMessage(new Exception("例外は null です。"));
                戻る;
            }

            // null でない場合は内部例外を取得します
            if (exception.InnerException != null) {
                例外 = 例外.InnerException;
            }

            if (例外は HttpException && ((HttpException)exception).GetHttpCode() == 404) {
                // 404 の例外メールを送信しない
            }
            そうしないと {
                sendErrorMessage(例外);
            }
        }

        #endregion

        #region プライベート メソッド

        ///
        /// 指定されたエラーを含む電子メール メッセージを送信します。
        ///
        /// 例外。
        private void sendErrorMessage(Exception ex) {
            使用 (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;

                using (SmtpClient クライアント = 新しい SmtpClient()) {
                    client.Host = ConfigurationManager.AppSettings["SMTPServer"];
                    client.Send(メッセージ);
                }
            }
        }

        ///
        /// 指定された例外に基づいて、エラー メールの件名を取得します。
        ///
        ///元。
        /// 要求された URL パス。
        /// System.String.
        private string getErrorEmailSubject(Exception ex, string requestedPath) {
            return !string.IsNullOrEmpty(ex.Message) ? string.Concat(requestedPath, " - ", ex.Message) : requestedPath;
        }

        #endregion

    }
4

1 に答える 1

0

DNN は、すでにすべての例外について電子メールを送信できます。これらすべてをイベ​​ント ログで設定し、イベントの種類を編集し、電子メール オプションを構成できます。

于 2014-09-10T22:46:55.017 に答える