IIS Recycle Global.asax
-
08-07-2019 - |
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
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;