2009-05-08 19 views
50

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.¿Cómo mantener activos los ensamblados de ASP.NET en AppDomain?

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 persistentemente la naturaleza volátil de los ensamblajes hacia la residencia de memoria.

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

Respuesta

72

En IIS 6, vaya a la sección Grupos de aplicaciones y haga clic con el botón derecho> Propiedades en el grupo que aloja la aplicación ASP.NET en cuestión. Ir a la ficha rendimiento y desactive la casilla "Cerrar procesos de trabajo tras estar inactivo durante:"

En IIS 7, vaya al panel de conexiones y encontrar grupos de aplicaciones y seleccione Configuración avanzada de la piscina que alberga 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 worker process, nunca morirá (a menos que mate el proceso o algo por supuesto). De forma predeterminada, IIS tendrá recycle the process cuando alcance algún límite, como un límite de memoria, pero también iniciará uno nuevo y "aplicará la fase" de todas las solicitudes entrantes hasta que la anterior no se utilice, a fin de minimizar las interrupciones.

También he escrito una pequeña clase de C# que será keep your ASP.NET application alive (alternate archived version) en circunstancias normales. Dado que se ejecuta dentro de la aplicación, obviamente no puede evitar que IIS o cualquier otra cosa mate explícitamente el proceso, pero mantendrá la aplicación "caliente", p. la aplicación nunca estará inactiva el tiempo suficiente para que IIS decida cerrarla.

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 x minutos para evitar que el grupo de aplicaciones agote el tiempo de espera. Nada especial: un simple WebRequest y un ciclo while() en una aplicación de consola funcionarán.

+0

Tengo un servidor compartido. No tengo acceso a la configuración de IIS en ese detalle. ¿De alguna manera podemos hacer esto por código o configuración a nivel de aplicación? –

+0

@s_ruchit el control del grupo de aplicaciones y los procesos de trabajo está en el alcance de IIS, por lo que no. La solución más común en su situación es tener una aplicación que viva en otra computadora (por ejemplo, una estación de trabajo siempre activa) que llegue a una página en su sitio cada ~ 10-15 minutos. Un servicio que no he utilizado personalmente y que pretende hacer eso para usted se puede encontrar en http://www.keepaliveforever.com/ –

+0

@Rex M: Eso fue fabuloso. Nunca salí de la caja. ¡Podría ser tan simple! Gracias una tonelada. De hecho, podríamos escribir nuestro propio cliente http para mantener la aplicación viva siempre. –

0

Escribí una pequeña aplicación de consola C# que mantiene mis 4 sitios vivos cada 10 minutos mediante el programador 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.

+0

Lo he hecho también, pero cada 1 minuto - La aplicación baja de todos modos. – Azimuth

3

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.

Cuestiones relacionadas