Frage

Ist es möglich, ein Recycling-Ereignis in der global.asax zu fangen?

Ich weiß Application_End ausgelöst werden, aber ist es eine Möglichkeit, zu wissen, dass es durch eine Rückführung des Anwendungspools ausgelöst wurde?

thx, Lieven Cardoen aka Johlero

War es hilfreich?

Lösung

So, hier ist eine Idee, wie das funktionieren könnte.

Auf der Grundlage meiner vorherige Antwort (heften sich an AppDomain.CurrentDomain.ProcessExit) und stephbu 's Kommentar:

  

Dies wird Falle meisten strukturierten Prozess   Zerlegungen z.B. - aber ich bin nicht sicher, dass   es wird alle Tränen downs abzufangen. z.B.    http://blogs.msdn.com/ jmstall / Archiv / 2006/11/26 / Prozess-Exit-event.aspx   Prozess recycle wird den Prozess töten   wenn es scheint gehangen zu werden - Ihre Handler   nicht aufgerufen.

Ich schlage vor, folgende Strategie:

In dem (regulären) ProcessExit Handler (die wir annehmen, wird nicht auf einem Anwendungspool Recycling genannt werden), schreiben Sie eine Datei auf der Festplatte wie „app_domain_end_ok.tmp“.

Dann in der Application_Start Ihrer global.asax Prüfung für diese Datei. Wenn es nicht vorhanden ist es ein Zeichen dafür ist, dass die Anwendung nicht auf saubere Weise beendet wurde (oder dass es das erste Mal, es begann). Vergessen Sie nicht, diese Datei von der Festplatte nach der Prüfung zu löschen.

Ich habe nicht versucht, dass ich selbst, aber es könnte einen Versuch wert sein.

Andere Tipps

fand ich diesen Artikel auf Scott Guthries Blog :

Anmelden ASP.NET-Anwendung Shutdown Ereignisse

  

Jemand auf einem listserv vor kurzem gefragt   ob es ein Weg, um herauszufinden,   warum und wann ASP.NET neu gestartet   Anwendungsdomänen. Insbesondere er   für die genaue Ursache war auf der Suche von   was auslösenden sie auf seinem   Anwendung in einer Produktions geteilt   gehosteten Umgebung (war es ein   web.config-Datei zu ändern, ein global.asax   Änderung, eine app_code Verzeichnisänderung,   ein Verzeichnis löschen ändern,   max-anzahl-Compilations erreichte Quote,   \ Ist Wechsel, etc).

     

Thomas auf mein Team hat einen kühlen   Code-Schnipsel, dass er das Verwendungen schrieb   einige nette privaten Reflexion Tricks   zu erfassen und diese Informationen zu protokollieren.   Es ist ziemlich einfach wiederverwenden und fügen   jede Anwendung in und kann verwendet werden,   anmelden Sie die Informationen überall   will (der folgende Code, um das NT-Ereignis verwenden   Melden Sie sich, es zu retten - aber man konnte nur als   Bitte senden Sie es einfach in eine Datenbank oder über eine   E-Mail an einen Admin). Der Code funktioniert   sowohl mit ASP.NET V1.1 und ASP.NET   V2.0.

     

Fügen Sie einfach die System.Reflection und   System.Diagnostics Namespace zu Ihrem   Global.asax Klasse / Datei, und fügen Sie dann   das Application_End Ereignis mit diesem   Code:

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

Ich habe nie versucht, diese selbst, aber man könnte versuchen, einen Event-Handler zum ProcessExit Ereignisse des AppDomain zu befestigen.

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

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

Ich hoffe, das hilft!

ich viel erfolgreicher war DomainUnload Veranstaltung mit dem Anbringen wird auf AppPool recycle und Anhalten des AppPool selbst ausgelöst wird.

AppDomain.CurrentDomain.DomainUnload += this.CurrentDomainOnProcessExit;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top