質問

global.asaxでリサイクルイベントをキャッチすることはできますか?

Application_Endがトリガーされることはわかっていますが、アプリケーションプールのリサイクルによってトリガーされたことを知る方法はありますか?

thx、リーベン・カルドーン、別名ジョレロ

役に立ちましたか?

解決

だから、これがどのように機能するかを考えてみましょう。

以前の回答(AppDomain.CurrentDomain.ProcessExitに添付)および stephbu のコメント:

  

これは、ほとんどの構造化プロセスをトラップします   分解-しかし、私はそれがわからない   すべての分解をトラップします。例えば    http://blogs.msdn.com/ jmstall / archive / 2006/11/26 / process-exit-event.aspx   プロセスのリサイクルはプロセスを強制終了します   ハングしているように見える場合-ハンドラー   呼び出されません。

次の戦略をお勧めします:

(通常の)ProcessExitハンドラー(アプリケーションプールのリサイクルでは呼び出されないものとします)で、" app_domain_end_ok.tmp "のようなファイルをディスクに書き込みます。

次に、global.asaxのApplication_Startでこのファイルを確認します。存在しない場合は、アプリケーションがクリーンな方法で終了しなかったこと(または初めて起動したこと)を示しています。チェック後にこのファイルをディスクから削除することを忘れないでください。

私はそれを自分では試しませんでしたが、試してみる価値はあります。

他のヒント

Scott Guthriesのブログでこの記事を見つけました:

ASP.NETアプリケーションシャットダウンイベントの記録

  

listservの誰かが最近質問した   把握する方法があったかどうか   ASP.NETが再起動する理由とタイミング   アプリケーションドメイン。具体的には、彼は   の正確な原因を探していました   彼にそれらを引き起こしたもの   本番共有のアプリケーション   ホスト環境(それは   web.configファイルの変更、global.asax   変更、app_codeディレクトリの変更、   ディレクトリ削除の変更、   max-num-compilationsがクォータに達しました。   \ binディレクトリの変更など)。

     

私のチームのトーマスはかっこいい   彼が書いたコードスニペット   気の利いたプライベートリフレクショントリック   この情報をキャプチャして記録します。   再利用して追加するのはとても簡単です   任意のアプリケーションに、そして使用することができます   どこでも情報を記録する   want(以下のコードはNTイベントを使用します   ログインして保存します-ただし、   簡単にデータベースに送信するか、   管理者へのメール)。コードは動作します   ASP.NET V1.1とASP.NETの両方で   V2.0。

     

単にSystem.Reflectionを追加し、   System.Diagnostics名前空間を   Global.asaxクラス/ファイル、および追加   これでApplication_Endイベント   コード:

public void Application_End() {

    HttpRuntime runtime = 
       (HttpRuntime) typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime",
          BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, 
          null, null, null);

    if (runtime == null)
        return;

    string shutDownMessage = 
       (string) runtime.GetType().InvokeMember("_shutDownMessage",
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
           null, runtime, null);

    string shutDownStack = 
       (string) runtime.GetType().InvokeMember("_shutDownStack",
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
           null, runtime, null);

    if (!EventLog.SourceExists(".NET Runtime")) {
        EventLog.CreateEventSource(".NET Runtime", "Application");
    }

    EventLog log = new EventLog();
    log.Source = ".NET Runtime";

    log.WriteEntry(String.Format(
          "\r\n\r\n_shutDownMessage={0}\r\n\r\n_shutDownStack={1}", 
          shutDownMessage, shutDownStack),
       EventLogEntryType.Error);
}

これを自分で試したことはありませんが、AppDomainのProcessExitイベントにイベントハンドラーをアタッチできます。

...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnExit);
...

void OnExit(object sender, EventArgs e) {
    // do something
}

これがお役に立てば幸いです!

DomainUnloadイベントへのアタッチがはるかに成功しました。AppPoolのリサイクルとAppPool自体の停止でトリガーされます。

AppDomain.CurrentDomain.DomainUnload + = this.CurrentDomainOnProcessExit;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top