Pertanyaan IIS Daur Ulang Global.asax


Apakah mungkin untuk menangkap acara daur ulang di global.asax?

Saya tahu Application_End akan dipicu tetapi apakah ada cara untuk mengetahui bahwa itu dipicu oleh daur ulang dari kolam aplikasi?

thx, Lieven Cardoen alias Johlero


7
2017-11-16 17:08


asal


Jawaban:


Jadi, inilah ide bagaimana ini bisa berhasil.

Berdasarkan pada saya jawaban sebelumnya (melampirkan ke AppDomain.CurrentDomain.ProcessExit) dan stephbuKomentar:

Ini akan menjebak proses yang paling terstruktur   teardown misalnya, - tapi aku tidak yakin itu   itu akan menjebak semua air mata. misalnya    http://blogs.msdn.com/jmstall/archive/2006/11/26/process-exit-event.aspx   Proses daur ulang akan mematikan proses   jika tampaknya digantung - handler Anda   tidak akan dipanggil.

Saya menyarankan strategi berikut:

Dalam handler ProcessExit (biasa) (yang kami kira tidak akan dipanggil pada daur ulang kolam aplikasi), tulis beberapa file ke disk seperti "app_domain_end_ok.tmp".

Kemudian di Application_Start dari pemeriksaan global.asax Anda untuk file ini. Jika tidak ada, itu adalah tanda bahwa aplikasi tidak dihentikan dengan cara yang bersih (atau ini adalah pertama kalinya ia memulai). Jangan lupa untuk menghapus file ini dari disk setelah pemeriksaan.

Saya tidak mencobanya sendiri, tetapi itu bisa dicoba.


3
2017-11-16 17:56



Saya menemukan artikel ini di Blog Scott Guthries:

Logging ASP.NET Aplikasi Shutdown Events 

Seseorang di listserv baru-baru ini bertanya   apakah ada cara untuk mencari tahu   mengapa dan kapan ASP.NET dimulai ulang   domain aplikasi. Secara khusus, dia   sedang mencari penyebab pasti   apa yang memicu mereka pada dirinya   aplikasi dalam produksi bersama   host environment (apakah itu a   perubahan file web.config, sebuah global.asax   berubah, perubahan direktori app_code,   sebuah direktori hapus perubahan,   max-num-compilations mencapai kuota,   \ bin perubahan direktori, dll).

Thomas di tim saya keren   cuplikan kode yang dia tulis yang digunakan   beberapa trik refleksi pribadi yang bagus   untuk menangkap dan mencatat informasi ini.   Sangat mudah untuk digunakan kembali dan ditambahkan   ke dalam aplikasi apa pun, dan dapat digunakan   untuk mencatat informasi di mana pun Anda berada   inginkan (kode di bawah ini menggunakan Peristiwa NT   Log untuk menyimpannya - tetapi Anda bisa saja   dengan mudah mengirimnya ke database atau melalui   email ke admin). Kode bekerja   dengan ASP.NET V1.1 dan ASP.NET   V2.0.

Cukup tambahkan System.Reflection dan   System.Diagnostics namespaces ke Anda   Kelas / file global.asax, lalu tambahkan   acara Application_End dengan ini   kode:

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);
}

7
2017-11-19 16:59



Saya belum pernah mencoba ini sendiri, tetapi Anda dapat mencoba melampirkan event handler ke acara ProcessExit dari AppDomain.

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

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

Saya harap ini membantu!


1
2017-11-16 17:25



Saya jauh lebih sukses dengan melampirkan ke acara DomainUnload, itu dipicu pada AppPool mendaur ulang dan penghentian AppPool itu sendiri.

AppDomain.CurrentDomain.DomainUnload += this.CurrentDomainOnProcessExit;


0
2017-11-10 11:48