Je trouve cet article sur Scott blog de Guthries:
Logging ASP.NET Application Shutdown Events
Quelqu'un sur une liste de diffusion a récemment demandé s'il y avait un moyen de comprendre pourquoi et quand ASP.NET redémarre domaines d'application. Plus précisément, il cherchait la cause exacte de ce qui les déclenche sur sa demande dans une production partagée environnement hébergé (était-il un changement de fichier web.config, un changement global.asax , un changement de répertoire App_Code, un changement de suppression de répertoire, max-num-compilations atteint quota, \ changement de répertoire bin, etc).
Thomas sur mon équipe a un frais bout de code qu'il a écrit que les utilisations quelques tricks de réflexion privés astucieuses pour capturer et enregistrer ces informations. Il est assez facile de réutiliser et d'ajouter dans une application, et peut être utilisé pour enregistrer les informations où vous besoin (le code ci-dessous utiliser l'événement NT le journal pour enregistrer - mais vous pouvez aussi facilement envoyez-le à une base de données ou via un e-mail à un administrateur). Le code fonctionne avec ASP.NET V1.1 et ASP.NET V2.0.
ajouter simplement le System.Reflection et System.Diagnostics à votre namespaces classe/fichier Global.asax, puis ajouter l'événement Application_End avec ce 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);
}
App recyclage peut être une affaire assez brutale en fonction de l'état de votre processus - le pire scénario est Win32 :: TerminateProcess appelé. Il n'y a aucun moyen de piéger un tel résultat dans votre processus. Qu'essayez-vous d'accomplir? Flushing un état? – stephbu