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 }