Pregunta

¿Es posible capturar un evento de reciclaje en global.asax?

Sé que Application_End se activará, pero ¿hay alguna manera de saber que fue activado por un reciclaje del grupo de aplicaciones?

gracias, Lieven Cardoen, también conocido como Johlero

¿Fue útil?

Solución

Entonces, aquí hay una idea de cómo podría funcionar esto.

Basado en mi respuesta anterior (adjuntar a AppDomain.CurrentDomain.ProcessExit) y comentario de stephbu :

  

Esto atrapará el proceso más estructurado   derribos p. - pero no estoy seguro de que   atrapará todas las rupturas. p.ej.    http://blogs.msdn.com/ jmstall / archive / 2006/11/26 / process-exit-event.aspx   El reciclaje del proceso matará el proceso   si parece estar colgado - tu manejador   no me llamarían.

Sugiero la siguiente estrategia:

En el manejador ProcessExit (normal) (que suponemos que no se invocará en el reciclaje de un grupo de aplicaciones), escriba algún archivo en el disco como " app_domain_end_ok.tmp " ;.

Luego, en el Application_Start de su global.asax verifique este archivo. Si no existe, es una señal de que la aplicación no se finalizó de manera limpia (o que es la primera vez que se inició). No olvide eliminar este archivo del disco después de la verificación.

No lo intenté yo mismo, pero podría valer la pena intentarlo.

Otros consejos

Encontré este artículo en el blog de Scott Guthries :

Registro de eventos de cierre de aplicaciones ASP.NET

  

Alguien en un servidor de listas preguntó recientemente   si había una manera de descubrir   por qué y cuándo se reinicia ASP.NET   dominios de aplicación Específicamente, él   estaba buscando la causa exacta de   lo que los estaba provocando en su   aplicación en una producción compartida   entorno alojado (¿fue un   cambio de archivo web.config, un global.asax   cambio, un cambio de directorio app_code,   un cambio de eliminación de directorio,   max-num-compilations alcanzó la cuota,   \ bin cambio de directorio, etc.).

     

Thomas en mi equipo tiene una genialidad   fragmento de código que escribió que utiliza   algunos ingeniosos trucos de reflexión privada   para capturar y registrar esta información.   Es bastante fácil de reutilizar y agregar   en cualquier aplicación, y se puede usar   para registrar la información en cualquier lugar   querer (el siguiente código usa el Evento NT   Inicie sesión para guardarlo, pero podría   enviarlo fácilmente a una base de datos o mediante un   correo electrónico a un administrador). El código funciona   con ASP.NET V1.1 y ASP.NET   V2.0.

     

Simplemente agregue el Sistema. Reflexión y   System.Diagnostics espacios de nombres para su   Global.asax class / file, y luego agregue   el evento Application_End con esto   código:

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

Nunca lo he intentado yo mismo, pero podría intentar adjuntar un controlador de eventos al evento ProcessExit del AppDomain.

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

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

¡Espero que esto ayude!

Tuve mucho más éxito al vincularme al evento DomainUnload, se activa en el reciclaje de AppPool y la detención del propio AppPool.

AppDomain.CurrentDomain.DomainUnload + = this.CurrentDomainOnProcessExit;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top