17

UPDATE - processo di replicare problema:ASP.NET si riavvia quando viene creata una cartella, rinominato o eliminato

1) Creare un progetto sito web c: \ projects \ restart-demo

2) Aggiungere web.config di default e una pagina aspx fittizia Test.aspx

3) Mappa IIS per puntare alla cartella principale c: \ projects \ restart-demo

4) Monitorare riavvio dell'applicazione utilizzando perfmon, monitoraggio della salute, monitoraggio in global.asax Application_End, ecc

5) Richiesta di pagina in del browser http://localhost/test.aspx

Avvio applicazione

6) Creare nuova cartella c: \ projects \ restart-demo \ asdf

fine applicazione

7) Richiesta di pagina in del browser http://localhost/test.aspx

Avvio applicazione

8) Rinomina cartella c: \ projects \ restart-demo \ asdf a c: \ projects \ restart-demo \ asdf1

applicazione finale

end update

Stiamo utilizzando un CMS di back-end per generare file e cartelle in un sito ASP.NET.

Gli utenti possono creare/modificare/eliminare file e inviarli alla Web farm.

Un problema che abbiamo notato:

Quando l'utente crea, rinomina o elimina una cartella, fa sì che il Dominio App per riavviare. Di conseguenza, la sessione , la cache, ecc. Sono tutti persi.

Nota che non è necessario essere una cartella speciale come/bin o/App_Code.

C'è un modo per prevenire questo comportamento?

E 'davvero ostacolando le prestazioni per due motivi:

  • Cache è oggetto di dumping quando il dominio applicazione viene riavviato
  • dominio
  • applicazione ha bisogno di essere ricostruita dopo il riavvio
+1

Questo accade il 100% delle volte o, quando si dice, viene creato un certo numero, come ogni 15 cambiamento? –

+0

Il comportamento che descrivi non è tipico. Puoi darci qualche info-codice più preciso forse? –

+0

@Nick: questo succede ogni volta. – frankadelic

risposta

15

Questo codice sembra risolvere il problema, quando aggiunto a Application_Start() in Global.asax:

PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); 
object o = p.GetValue(null, null); 
FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase); 
object monitor = f.GetValue(o); 
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic); 
m.Invoke(monitor, new object[] { }); 

http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx

Con queste modifiche, posso creare/modificare/eliminare le cartelle senza provocare la applicazione per riavviare.

Non chiaro se questa è la soluzione migliore. Non so se ci saranno effetti collaterali indesiderati a causa della chiamata di StopMonitoring.

+1

Sembra un enorme trucco, ma se funziona suppongo che tu non abbia scelta. +1 per segnalare la tua soluzione. – mxmissile

+0

Inoltre, c'è un esempio più completo di come farlo qui: http://www.aaronblake.co.uk/blog/2009/09/28/bug-fix-application-restarts-on-directory-delete-in- asp-net / –

0

Abilita ASP.NET Health Monitoring e cercare nella il registro eventi per vedere perché il riavvio di AppDomain.


Scommetto che questo è perché hai usato un progetto di sito web, invece di un progetto di applicazione web. Prova a riprodurlo con un progetto di applicazione web.

Inoltre, è in esecuzione un software antivirus o di indicizzazione? Tale software rileva quando le cartelle vengono create e/o modificate.

+0

Messaggio evento: l'applicazione si sta spegnendo. Motivo: sconosciuto. – frankadelic

+0

Appena provato con il progetto di applicazione Web. Stesso problema. – frankadelic

+0

Grazie per il controllo. In questo caso, ti suggerisco di cercare software anti-virus e magari software di indicizzazione. ASP.NET non causa riavvii ogni volta che vengono create le cartelle - qualcos'altro _è_. –

2

Per impostazione predefinita, un'applicazione asp.net si riavvierà ogni 15 volte un file cambia all'interno della sua directory virtuale, questo per compensare le ricompilazioni parziali e il loro peso in memoria rispetto alle prestazioni generali ... è possibile modificare questo comportamento, ma l'utilizzo della memoria potrebbe l'aumento e le prestazioni scenderanno nel tempo.

A tale scopo, impostare il numRecompilesBeforeAppRestart attribute on the compilation element, web.config avrebbe en elemento come questo:

<configuration> 
    <system.web> 
    <compilation numRecompilesBeforeAppRestart="15"> 

Il valore predefinito è 15, è possibile modificare a quello che volete, leggere il link per maggiori informazioni . Tuttavia, è in questo modo per un motivo, non è consigliabile avere il tuo contenuto dinamico all'interno della directory virtuale dell'app, meglio averlo accanto o altrove.

+0

Niente sta ricompilando. Sto solo creando cartelle vuote. Inoltre, ho perfezionato numRecompilesBeforeAppRestart e l'Application_End continua a scattare ogni volta che una cartella viene creata/modificata/cancellata. – frankadelic

+0

@frankadelic - Puoi aggiornare con un esempio di alcune cartelle che vengono create, in relazione alla radice? –

+0

Aggiunti passaggi per replicare il problema. – frankadelic

9

Forse un po 'tardi, ma la memorizzazione e la gestione dei file temporanei in una cartella diversa all'esterno del wwwroot dell'applicazione risolve anche il problema.

2

Aggiunta di "fcnMode="Disabled" alle impostazioni <httpRuntime> nello web.config disattiva AppDomain riciclaggio quando il contenuto della cartella radice Web viene modificato.

Problemi correlati