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

Était-ce utile?

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;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top