2009-08-20 18 views
14

Creo que escuché que las aplicaciones ASP.NET se apagarán después de un tiempo de estar inactivas (es decir, sin visitantes).¿Puede evitar que se cierre su aplicación ASP.NET?

¿Hay alguna manera de evitar este comportamiento? Tengo un temporizador que ejecuta un código del evento global.asax.cs application_start y quiero asegurarme de que continúe ejecutándose, incluso cuando no haya visitantes en el sitio.

¡Gracias de antemano!

+1

Dependiendo del código que se ejecuta, me gustaría hacer que un servicio de Windows que se ejecuta en el servidor. – Martin

+0

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. –

Respuesta

25

Puede hacerlo de varias maneras.

  1. Si tiene control sobre IIS, puede cambiar el "Tiempo de espera inactivo" dentro del grupo de aplicaciones, de manera predeterminada son 20 minutos.
  2. Si NO tiene control sobre IIS (Shared u otro hosting), puede usar un servicio externo para hacer ping al sitio. MyWebKeepAlive o Pingdom son buenas opciones para esto.

Si se encuentra en la opción dos, le recomiendo una fuente externa, ya que es menos de administrar, y si no tiene IIS disponible para configurar, lo más probable es que no tenga el servidor disponible para agregar una aplicación de ping a.

Además, no recomiendo algo que se encuentra en proceso con la aplicación web, como he encontrado que estos pueden causar problemas cuando la aplicación realmente necesita para reciclar ...

Una última reflexión

Si va por la ruta de modificar el tiempo de inactividad de IIS, le recomiendo configurar un reciclaje regular del grupo de aplicaciones. Como muchas aplicaciones web se benefician de un reciclaje periódico, y comúnmente el tiempo de espera inactivo es el mayor factor de reciclaje regular.

+0

+1 para el externo mantener vivo, y otro +1 (si puedo) para recomendar el traslado del código del temporizador a un servicio. –

+1

+1 Mantenimiento externo vivo funciona bien. Incluso podría escribir su propio servicio para ejecutar un servidor para mantener vivo el sitio. – Audioillity

+0

Establezca el "Tiempo de espera inactivo" en cero para inhabilitar el reciclaje por completo. Vea también aquí: https://stackoverflow.com/questions/1596267/how-to-disable-the-application-pool-idle-time-out-in-iis7 –

7

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á.

0

Vaya a su administrador de tareas y elimine w3wp.exe (o aspnet_wp). Nada puede impedirte hacer esto. En pocas palabras, las aplicaciones ASP.NET no pueden asumir una funcionalidad continua.

Sin embargo, puede iniciar una secuencia independiente, que no estará sujeta a tiempos de espera inactivos, siempre que tenga algo que hacer.Utilicé esta técnica para controlar una importación de 45 minutos que continuaría independientemente de si alguien estaba o no en el sitio web. Usé un registro de transacciones y Application_Start para que cuando se reciclara el proceso, retomara donde lo había dejado.

13

Además externa mantienen viva que pueda tomar una interna mantener vivo dentro global.asax:

static Thread keepAliveThread = new Thread(KeepAlive); 

    protected void Application_Start() 
    { 
     keepAliveThread.Start(); 
    } 

    protected void Application_End() 
    { 
     keepAliveThread.Abort(); 
    } 

    static void KeepAlive() 
    { 
     while (true) 
     { 
      WebRequest req = WebRequest.Create("http://www.mywebsite.com/DummyPage.aspx"); 
      req.GetResponse(); 
      try 
      { 
       Thread.Sleep(60000); 
      } 
      catch (ThreadAbortException) 
      { 
       break; 
      } 
     } 
    } 
+0

¡Ingenioso en teoría! Pero, ¿alguien lo ha intentado? Funciona ? Además, si hace esto de forma externa, y lo hace cada 21 minutos después de la aplicación_start, se reciclará y luego se reiniciará. Escriba la última hora de inicio y la hora de apagado en la base de datos, luego puede reiniciarlo con un servicio de Windows después de cada reciclado completado. –

+1

He probado antes de publicar – Eduardo

Cuestiones relacionadas