2011-01-18 19 views
7

Tengo en mi variable estática de ASP.NET que se vacía a DB cada inserción X. El problema es que, si publico la aplicación, el proceso de IIS se cancela con todo mi material estático.Cómo escuchar el evento de cierre de IIS en ASP.NET

¿Cómo puedo preservarlo, o cómo puedo eliminarlo una vez que la aplicación ASP.NET se está cerrando?

agradecimiento

Respuesta

9

Global.asax

void Application_End(object sender, EventArgs e) 
    { 
     // SHUTDOWN CODE HERE 
    } 
5

Su tipo de arriesgado depender de eventos de aplicación Parada de mantener una base de datos actualizada. Si IIS se reinicia forzosamente, se recicla o hay un corte de energía, entonces se perderá el evento.

+1

bueno, estos casos no puedo controlar. Quiero controlar lo que sé y tengo ... – Himberjack

+1

si no te importa perder estos casos extremos, entonces es posible que no te molestes con el manejo de un apagado de aplicación elegante.solo haga que forme parte de las suposiciones de la aplicación – djeeg

+0

La "caja de borde común" más común es la preocupación por un cierre "elegante" *, p. ej. para eliminar el registro, sin los inesperados .. los grupos de aplicaciones se pueden reciclar con bastante frecuencia (y para un entorno grande con muchas agrupaciones, esto significa que podría haber muchos eventos perdidos de "borde común"). – user2864740

3

Es posible que no reciba ninguna notificación de que IIS se está cerrando. Piense en lo que sucederá si el AppStaol de IIS falla o lo que sucederá si el servidor simplemente pierde potencia.

No puede confiar en que alguna vez haya escuchado sobre eventos de apagado. Si IIS desea cerrar, no necesariamente va a notificar a su aplicación. Le recomiendo que vuelva a pensar su escenario de almacenamiento en memoria caché/almacenamiento en memoria caché - solo guarde en la memoria los datos que puede permitirse perder.

3

Como ya se ha mencionado, no es recomendable que la aplicación conserve datos grandes durante Application_End, ya que esto podría desencadenarse cuando el grupo de aplicaciones se apaga, no al principio de su apagado. Esto se explica en forma más detallada (pero aún corta) here.

Si todavía quiere atrapar el cierre de un grupo de aplicaciones para todos los casos que no matan al instante, puede hacer lo siguiente:

manera sucia

1) Obtener límite de tiempo de apagado - Administrador de IIS -> Grupos de aplicaciones -> -> Configuración avanzada ... -> Grupo de modelos de proceso -> Límite de tiempo de apagado (segundo)

2) Cree un subproceso/tarea en la aplicación para que se ejecute el doble de veces que el apagado límite de tiempo para asegurar que el estado de "apagado" pueda ser capturado. Este hilo debe

i) comprobar si el grupo de aplicaciones se está cerrando

public bool IsShuttingDown() 
{ 
    return System.Web.Hosting.HostingEnvironment.ShutdownReason != ApplicationShutdownReason.None; 
} 

ii) si el cierre está activado, hacer tus cosas. Asegúrese de que se ejecute esas cosas sólo una vez

manera más correcta (como se indica here)

1) Crear una clase que implementa IRegisteredObject

public class HostingEnvironmentRegisteredObject : IRegisteredObject 
{ 
    // this is called both when shutting down starts and when it ends 
    public void Stop(bool immediate) 
    { 
     if (immediate) 
      return; 

     // shutting down code here 
     // there will about Shutting down time limit seconds to do the work 
    } 
} 

2) Registre su objeto (Global.asax.cs)

protected void Application_Start() 
{ 
    // other initialization code here 

    HostingEnvironment.RegisterObject(new HostingEnvironmentRegisteredObject()); 
} 
Cuestiones relacionadas