Para ser honesto, traté de hacer un truco sucio en IIS y justo cuando pensaba que iba a salirse con la suya, me di cuenta de que mi solución no funciona. Esto es lo que he intentado hacer:
1) Tengo una aplicación ASP.NET que tiene una clase Preloader que hereda IProcessHostPreloadClient y realiza toda la inicialización pesada en la implementación del método Preload (la aplicación es compleja y es parte de un sistema enorme, por lo que requiere aproximadamente 2 minutos para establecer conexiones a todo lo necesario servicios y pre-instanciar algunos registros de Unity).
2) Tengo mucho trabajo que hacer en el cierre de la aplicación (cancelar la suscripción, desconectar, eliminar, ...), y creo que el mejor lugar para hacerlo es en el método * Application_End * ubicado en Global.asax .
3) Todo funciona bien cuando tengo actividad de usuario (la primera solicitud después de que se inicie el grupo de aplicaciones que contiene la aplicación web mencionada anteriormente hará que se llame a * Application_Start * y luego * Application_End * se llame al detener o reciclar el grupo de aplicaciones), pero los problemas se produce cuando no hay actividad del usuario y la aplicación intenta reiniciarse después de estar activa durante 48 horas (requisito configurado). Como no hubo solicitudes, la aplicación oficialmente no comenzó. Ergo, no se puede detener con gracia ya que no se llamará * Application_End *.
4) Ahora viene la parte desordenada ... He intentado hacer una solicitud GET desde el código al final del método de Precarga , y funcionó. Pero esta solución me pareció mala, aunque funcionó. Entonces, probé muchas cosas, y lo último que probé fue esto:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... y eso ha hecho su propósito. Se llamó a * Application_Start * (verifiqué la respuesta, contenía una página de inicio de sesión que se suponía que debía mostrarse en la solicitud inicial) y en el cierre del grupo de aplicaciones, la aplicación finalizó correctamente haciendo el trabajo necesario en * Application_End *.
PERO
Después de que la aplicación se inició (precargó e inició) de esta manera, esto es lo que sucedió cuando quería acceder a la aplicación a través del navegador web:
Error HTTP 500.21: el controlador interno de errores del servidor "ExtensionlessUrlHandler-Integrated-4.0" tiene un módulo incorrecto "ManagedPipelineHandler" en su lista de módulos
No puedo resolver esto. ¿Alguien puede decirme por qué sucede esto y cómo solucionarlo?
Si no lo resuelvo, volveré a la primera solución (enviar una solicitud GET desde el código), pero este problema me molestará ya que ni siquiera tengo una idea de lo que está mal.