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. 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 alcance 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.
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 bucle simple de WebRequest y de while() en una aplicación de consola funcionará.
Dependiendo del código que se ejecuta, me gustaría hacer que un servicio de Windows que se ejecuta en el servidor. – Martin
Idealmente sí, este código debe estar en un servicio. Sin embargo, para mayor flexibilidad y portabilidad, decidimos ejecutar el código desde global.asax.cs. –