2015-04-07 18 views
12

Ho iniziato a vedere errori in un'app Web MVC su NetApp ospitata su Appharbor mentre era in esecuzione un thread in background, dopo un'attenta analisi, non riesco a capire la causa.Quali sono le possibili cause per IIS di generare un'eccezione ThreadAbortException e di riciclare il worker, con IIS che registra "IIS configuration change"?

In primo luogo, l'eccezione che ho notato è un ThreadAbortException.

Tuttavia, questo significa solo che il thread viene ucciso. Prima che il thread venga ucciso, è possibile vedere un nuovo worker creato da IIS e Application_Start viene chiamato sulla stessa macchina. Una volta che la nuova applicazione è attiva e funzionante, IIS elimina la vecchia app e le nuove richieste vengono gestite come previsto.

Allo stesso tempo, IIS registra un messaggio di:

ShutDown Message: IIS configuration change 
HostingEnvironment initiated shutdown 
HostingEnvironment caused shutdown 
ShutDown Stack: at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) 
    at System.Environment.get_StackTrace() 
    at System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal() 
    at System.Web.Hosting.HostingEnvironment.InitiateShutdownWithoutDemand() 
    at System.Web.Hosting.PipelineRuntime.StopProcessing() 

In Net Health Monitor registrazione si ottiene un:

Message: Application is shutting down. Reason: Configuration changed. 
Event Detail Code: 50004 

Un google rapido rivela il codice sorgente ho il sospetto è il motivo per l'errore:

if (!HostingEnvironment.StopListeningWasCalled && !HostingEnvironment.ShutdownInitiated) { 
    // If GL_STOP_LISTENING wasn't triggered, the reset is likely due to a configuration change. 
    HttpRuntime.SetShutdownReason(ApplicationShutdownReason.ConfigurationChange, "IIS configuration change"); 
} 

fonte: https://github.com/Microsoft/referencesource/blob/master/System.Web/Hosting/IPipelineRuntime.cs

012.

Il mio primo pensiero è stato quello di controllare i timestamp per le modifiche ai file, sia nella cartella bin che nella directory principale dell'applicazione - tuttavia, questo errore viene generato senza modifiche al file. Dato che succede solo su Appharbor, non posso collegarmi al processo ed eseguire il debug in questo modo. Ho anche monitorato l'utilizzo della memoria e non vedo alcun problema lì.

Gli stati del codice sorgente:

If GL_STOP_LISTENING wasn't triggered, the reset is likely due to a configuration change.

Quindi, ciò che altro potrebbe essere la causa l'errore e l'applicazione di riciclo, se gli altri file web.config/config non stanno cambiando?

+0

Hai accesso al registro eventi di Windows? Hai provato a chiedere ad AppHarbor? –

+0

Sì: asp health monitoring restituisce al mio DB qualsiasi evento, ma semplicemente dichiara: "L'applicazione si sta spegnendo. Motivo: configurazione modificata." - Appharbor dice di non sapere perché sta accadendo e non può fare altro (oltre a suggerire di ri-progettare la mia applicazione). – dazbradbury

+0

* monitoraggio della salute * non cattura tutti gli eventi che possono essere registrati nel registro eventi di Windows. Un processo esterno può fare cose e può registrarlo nei registri eventi di Windows. Inoltre * AppHarbor * utilizza un pool di applicazioni * dedicato * per la tua applicazione? –

risposta

1

Sembra che si tratti di un bug Microsoft.

Unexpected ASP.Net application shutdown after many App_Data file changes occur on a server that is running Windows Server 2012 R2

Hotfix: https://support.microsoft.com/en-us/kb/3052480

Last Review: 09/08/2015 16:29:00

Una volta applicato questo hotfix, gli errori sono andati via!

5

Ci sono molti motivi, che sono elencati da questo helpful blog entry.

  • impostazioni del pool di applicazioni
  • L'elemento processModel del machine.config
  • limite di memoria
  • Richiesta limite
  • Timeout modifica della configurazione
+1

Tutti questi motivi causano un messaggio "Modifica configurazione IIS"? O ognuno di essi fornisce un messaggio di errore/log separato e più accurato? – dazbradbury

+0

Ho paura che né questo post di blog, né questa risposta, in realtà risponde alla domanda. L'applicazione viene riciclata per nessuno di questi motivi in ​​base a ciò che posso registrare e alla posizione di appharbor. – dazbradbury

1

IIS dovrebbe accadere quando qualcosa cambia (qualsiasi cosa) nella configurazione o nel codice dell'applicazione IIS. Esempi:

  • Variazione web.confg
  • Variazione in qualsiasi dll, aspx, ecc ...

In nessuno di questi casi, l'applicazione IIS riciclare. Inoltre, IIS ricicla il processo ogni 29 ore per impostazione predefinita, ma probabilmente non verrà chiamato "Modifica configurazione IIS"

+0

Come da mia domanda - Ho controllato la data e l'ora di eventuali cambiamenti nella directory bin, oltre che in generale, ma non riesco a vedere nulla che si distingua. Se questa fosse la causa, ci sarebbe un modo per vedere quale file sta causando il riciclo? Ho inserito questo codice monitor nell'applicazione_end e viene eseguito: i timestamp corrispondono all'ora in cui il codice è stato distribuito per la prima volta. – dazbradbury

+0

Manca quella parte nella tua domanda. Scusate. Tuttavia, è perfettamente normale che IIS ricicli la tua applicazione. Non viene ucciso ma viene arrestato in modo relativamente agevole, viene generato un nuovo processo per le nuove richieste e il processo precedente può completare l'elaborazione delle richieste. Perché è importante per te trovare il motivo esatto per il riciclo? Dovresti solo presumere che accadrà e lavorerà con quello. –

+0

Poiché non consente il completamento del processo precedente, almeno su appharbor interrompe il processo in esecuzione entro un intervallo di tempo specificato (attualmente 5 minuti). – dazbradbury