reiniciar regular recycled practices periodicrestart interval best automatically application iis events global-asax recycling recycle

regular - IIS Recycle Global.asax



regular time interval iis (4)

¿Es posible atrapar un evento de reciclaje en el archivo global.asax?

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

thx, Lieven Cardoen alias Johlero


Nunca lo intenté yo mismo, pero podrías 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!


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

Registro de eventos de apagado de aplicaciones ASP.NET

Alguien en una lista de correo recientemente preguntó si había una forma de averiguar por qué y cuándo ASP.NET reinicia los dominios de la aplicación. Específicamente, estaba buscando la causa exacta de lo que los desencadenaba en su aplicación en un entorno alojado de producción compartida (¿era un cambio de archivo web.config, un cambio a nivel global, un cambio de directorio de código de aplicación, un cambio de eliminación de directorio, máximo -num-compilations alcanzó la cuota, / bin cambio de directorio, etc.).

Thomas en mi equipo tiene un excelente fragmento de código que escribió que usa algunos ingeniosos trucos de reflexión privada para capturar y registrar esta información. Es bastante fácil de reutilizar y agregar a cualquier aplicación, y se puede utilizar para registrar la información en cualquier lugar que desee (el código siguiente utiliza el registro de eventos de NT para guardarlo, pero también podría enviarlo fácilmente a una base de datos o a través de un correo electrónico a un administrador). El código funciona tanto con ASP.NET V1.1 como con ASP.NET V2.0.

Simplemente agregue los espacios de nombres System.Reflection y System.Diagnostics a su clase / archivo Global.asax y luego agregue el evento Application_End con este 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); }


Tuve mucho más éxito al adjuntarme al evento DomainUnload, se activó en el reciclado y la detención de AppPool de la propia AppPool.

AppDomain.CurrentDomain.DomainUnload += this.CurrentDomainOnProcessExit;


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

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

Esto atrapará la mayoría de los desmantelamientos de procesos estructurados, por ejemplo, pero no estoy seguro de que pueda atrapar todos los arranques. por ejemplo, http://blogs.msdn.com/jmstall/archive/2006/11/26/process-exit-event.aspx. El proceso de reciclaje matará el proceso si parece estar bloqueado; no se llamará a su controlador.

Sugiero seguir la estrategia:

En el manejador de ProcessExit (regular) (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, busque este archivo. Si no existe, es una señal de que la aplicación no finalizó de forma limpia (o de que es la primera vez que se inicia). No olvides eliminar este archivo del disco después de la verificación.

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