¿Cómo mantener activos los ensamblados de ASP.NET en AppDomain?

Escenario: tengo una aplicación ASP.NET empresarial n-Tier implementada utilizando proyectos de implementación web. Todos los niveles producen ensamblajes independientes consumidos por la aplicación ASP.NET.

Problema: cuando ejecuto la aplicación. por primera vez después del despliegue, lleva mucho tiempo cargar ensamblajes dependientes en la memoria. Pero una vez cargada su aplicación de iluminación rápida. En caso de que no haya usuarios accediendo a la aplicación, IIS descarga los ensamblajes de la memoria y cuando un usuario intenta acceder a la aplicación en una instancia posterior, continúa cargando todos los ensamblajes, tomando la misma cantidad de tiempo para cargarlos. toma hacerlo por primera vez.

Estoy buscando una solución que me permita mantener mis ensamblajes cargados en la memoria anulando de forma persistente la naturaleza volátil de los ensambles hacia la residencia de memoria.

O cualquier otra solución que permita a mis usuarios usar felizmente la aplicación que resuelve el problema mencionado.

En IIS 6 , vaya a la sección Grupos de aplicaciones y haga clic con el botón derecho en> Propiedades en el grupo que alberga la aplicación ASP.NET en cuestión. Vaya a la pestaña Rendimiento y desmarque “Cerrar procesos de trabajo después de estar inactivo para:”

En IIS 7 , vaya al panel Conexiones y encuentre Grupos de aplicaciones, y seleccione Configuración avanzada para el grupo que aloja su aplicación. Busque la propiedad “Tiempo de espera inactivo” y configúrela como “0” (esto la desactiva).

El valor predeterminado es 20 minutos de inactividad. Al desmarcar la casilla, una vez que su AppDomain es cargado por el proceso de trabajo , nunca morirá (a menos que mate el proceso o algo por supuesto). De forma predeterminada, IIS reciclará el proceso cuando scope algún límite, como un límite de memoria, pero también iniciará uno nuevo y “aplicará la fase” a todas las solicitudes entrantes hasta que no se use el antiguo, a fin de minimizar las interrupciones.

También escribí una pequeña clase c # que mantendrá viva tu aplicación ASP.NET ( versión archivada alternativa ) en circunstancias normales. Dado que se ejecuta dentro de la aplicación, obviamente no puede evitar que IIS o cualquier otra cosa mate el proceso explícitamente, pero mantendrá la aplicación “caliente”, por ejemplo, la aplicación nunca estará inactiva el tiempo suficiente para que IIS decida apagarla. .

Si no tiene control directo sobre su configuración de IIS (host compartido, por ejemplo) su mejor opción es tener una pequeña aplicación ejecutándose en un sistema separado, por ejemplo, una estación de trabajo siempre activa, que llegue a su sitio cada x minutos para mantener el grupo de aplicaciones de tiempo de espera. Nada especial: un bucle simple de WebRequest y de while () en una aplicación de consola funcionará.

Una de las ventajas de ASP .net es la posibilidad de crear instancias estáticas (compartidas) de objetos.

Para evitar la necesidad de un proceso externo, puede crear un temporizador estático en (por ejemplo) global.asax que invoca una página en el dominio con una simple WebRequest. De esta manera, el sitio se mantiene vivo hasta que se realice un reinicio manual de la agrupación.

Escribí una pequeña aplicación de consola C # que mantiene vivos mis 4 sitios cada 10 minutos a través del progtwigdor de tareas de Windows. La vida es una vez más buena. No ejecutamos la aplicación entre las 2 y las 5 de la madrugada solo para que los servidores puedan realizar limpiezas de memoria, incluso si es importante. para nuestros sitios rara vez hay alguien en esas horas de todos modos.