IIS Recycle Global.asax
-
08-07-2019 - |
Question
Est-il possible d'attraper un événement de recyclage dans le fichier global.asax?
Je sais que Application_End sera déclenché, mais y a-t-il moyen de savoir qu'il a été déclenché par un recyclage du pool d'applications?
thx, Lieven Cardoen aka Johlero
La solution
Alors, voici une idée de la façon dont cela pourrait fonctionner.
Sur la base de ma réponse précédente (joindre à AppDomain.CurrentDomain.ProcessExit) et Le commentaire de stephbu :
Cela piègera le processus le plus structuré démantèlement, par exemple - mais je ne suis pas sûr que il va piéger tous les démolitions. par exemple. http://blogs.msdn.com/ jmstall / archive / 2006/11/26 / process-exit-event.aspx Processus de recyclage va tuer le processus s'il semble être suspendu - votre gestionnaire ne serait pas appelé.
Je suggère la stratégie suivante:
Dans le gestionnaire (habituel) de ProcessExit (qui, nous supposons, ne sera pas appelé lors du recyclage d'un pool d'applications), écrivez un fichier sur le disque du type " app_domain_end_ok.tmp
".
Ensuite, dans le champ Application_Start de votre fichier global.asax, recherchez ce fichier. S'il n'existe pas, c'est un signe que l'application n'a pas été fermée correctement (ou que c'est la première fois qu'elle a démarré). N'oubliez pas de supprimer ce fichier du disque après la vérification.
Je n’ai pas essayé cela moi-même, mais cela pourrait valoir la peine d’être essayé.
Autres conseils
J'ai trouvé cet article sur le blog de Scott Guthries :
Enregistrement des événements d'arrêt d'application ASP.NET
Une personne sur un serveur de liste 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 a déclenchés sur son application dans une production partagée environnement hébergé (était-ce un changement de fichier web.config, une global.asax change, un changement de répertoire app_code, une suppression de répertoire, max-num-compilations atteint le quota, \ bin changement de répertoire, etc).
Thomas sur mon équipe a un cool extrait de code qu'il a écrit qui utilise quelques astuces de réflexion privé astucieux pour capturer et enregistrer ces informations. Il est assez facile de réutiliser et d’ajouter dans n'importe quelle application, et peut être utilisé enregistrer les informations où que vous soyez veux (le code ci-dessous utilise le NT Event Connectez-vous pour le sauvegarder & # 8211; mais vous pourriez tout aussi bien envoyer facilement à une base de données ou via un email à un administrateur). Le code fonctionne avec ASP.NET V1.1 et ASP.NET V2.0.
Ajoutez simplement le System.Reflection et System.Diagnostics à votre espace de noms Classe / fichier Global.asax, puis ajoutez l'événement Application_End avec cette 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);
}
Je n'ai jamais essayé cela moi-même, mais vous pouvez essayer de joindre un gestionnaire d'événements à l'événement ProcessExit de l'AppDomain.
...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnExit);
...
void OnExit(object sender, EventArgs e) {
// do something
}
J'espère que cela vous aidera!
L’attachement à un événement DomainUnload a été beaucoup plus efficace; il est déclenché lors du recyclage d’AppPool et lors de l’arrêt de celui-ci.
AppDomain.CurrentDomain.DomainUnload + = this.CurrentDomainOnProcessExit;