5

一度だけ実行する必要があるコードを実行していますが、外部リソースに依存しているため、失敗する可能性があります。イベント ログにエラーを表示したいのですが、ユーザーには表示したくありません。可能であれば、カスタム エラー ページの使用は避けたいと思います。

例外をキャッチして自分でイベント ログに書き込むことはできますが、asp.net イベント ソースの名前がどうなるか保証できないことが懸念されます (フレームワークのバージョンによって変わるようです)。管理者権限が必要なため、独自のイベント ソースを作成できません。

私が現在取り組んでいるアプローチは、ちょっとしたハック (まだ機能していません) で、次のようになります。

    public void Init(HttpApplication context)
    {
        try
        {
            throw new Exception("test"); // This is where the code that errors would go
        }
        catch (Exception ex)
        {
            HttpContext.Current.Application.Add("CompilationFailed", ex);
        }
    }

    private void context_BeginRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.Application.AllKeys.Contains("CompilationFailed"))
        {
            // It failed on Init - we can't throw an exception there so lets try it here

            var origEx = (Exception)HttpContext.Current.Application["CompilationFailed"];
            // Only ever do this once
            HttpContext.Current.Application.Remove("CompilationFailed");

            // This should just look like a normal page load to the user 
            // - it will be the first request to the site so we won't be 
            //  interrupting any postbacks or anything


            HttpContext.Current.Response.AddHeader("Location", "/");
            HttpContext.Current.Response.StatusCode = 301;
            try
            {
                HttpContext.Current.Response.End();
            }
            catch (ThreadAbortException ex)
            {
                throw origEx; 
            }
        }
    }

理想的には、IIS 内に RecordException() メソッドが存在する場合、それが本当に必要です。

4

2 に答える 2

1

エラーが発生したときに通知を受け取りたいが、ユーザーに知らせたくないようです。ページをリダイレクトしたり (致命的なエラーの場合)、電子メールを送信したり、アクセスできるデータ ソースに書き込んだりした後、残りのファイル/ページの実行を終了することができます。

于 2013-07-19T16:29:26.883 に答える