IIS Recycle Global.asax
-
08-07-2019 - |
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
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;