2011-01-18 9 views
7

Ho nella mia variabile statica ASP.NET che si svuota sul DB ogni X inserzioni. Il problema è che, se pubblico l'applicazione, il processo IIS viene ucciso con tutto il mio materiale statico.Come ascoltare l'evento di arresto di IIS in ASP.NET

Come posso conservarlo - o come posso svuotare una volta che l'applicazione ASP.NET si sta spegnendo?

ringraziamento

risposta

9

Global.asax

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

suo genere di rischioso fare affidamento su eventi di arresto applicazione per tenere un database aggiornato. Se IIS viene riavviato forzatamente, riciclato o c'è un'interruzione dell'alimentazione, allora ti mancherà l'evento.

+1

sì bene, questi casi non riesco a controllare. Voglio controllare quello che so e avere ... – Himberjack

+1

se non ti interessa perdere questi casi limite, allora non ti preoccupare della gestione di un arresto regolare dell'applicazione.rendi semplicemente parte delle supposizioni della tua applicazione – djeeg

+0

Più il "caso limite comune" si preoccupa di un arresto * grazioso *, ad es. per svuotare la registrazione, senza quelle inaspettate .. i pool di app possono essere riciclati abbastanza spesso (e per un grande ambiente con molti pool questo significa che potrebbero esserci molti eventi "caso limite comune" persi). – user2864740

3

Potrebbe non ricevere alcuna notifica che IIS si sta arrestando. Pensa a cosa accadrà se IIS AppPool si arresta in modo anomalo o cosa accadrà se il server perde potenza.

Non si può fare affidamento per aver mai sentito parlare di eventi di chiusura. Se IIS vuole chiudere, non notificherà necessariamente la tua applicazione. Ti consiglio di ripensare lo scenario di writebuffering/caching: tieni solo in memoria i dati che puoi permetterti di perdere.

3

Come già affermato, è altamente sconsigliato che l'applicazione mantenga dati di grandi dimensioni durante Application_End, poiché potrebbe essere attivata quando il pool di applicazioni viene arrestato, non all'inizio del suo arresto. Questo è spiegato in modo più dettagliato (ma comunque breve) here.

Se si vuole ancora per prendere la chiusura di un pool di applicazioni per tutti i casi che non istantaneamente ucciderlo, in grado di effettuare le seguenti operazioni:

modo sporco

1) Ottenere limite di tempo di spegnimento - Gestore IIS -> Pool di applicazioni -> -> Impostazioni avanzate ... -> Gruppo modello di processo -> Limite tempo di spegnimento (secondo)

2) Creare un thread/attività nell'applicazione per eseguire due volte più spesso dell'arresto limite di tempo per garantire che lo stato di "arresto" possa essere catturato. Questo thread dovrebbe

i) verificare se pool di applicazioni si sta spegnendo

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

ii) se la chiusura è attiva, fare le tue cose. Assicurarsi che roba è eseguito solo una volta

Più corretto modo (come indicato here)

1) Creare una classe che 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) Pubblica il tuo oggetto (Global.asax.cs)

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

    HostingEnvironment.RegisterObject(new HostingEnvironmentRegisteredObject()); 
} 
Problemi correlati