Marco Valsecchi

Directory.Delete() elimina le sessioni e la cache in memoria... dho!

24 giugno 2010 • ⏲️ 1 min.

La situazione è questa: sito asp.net 3.5 (C#) in cui sfrutto l’oggetto cache per velocizzare il caricamento di alcune collezioni provenienti da query o sempre uguali o troppo onerose per farle sempre…

…fin qua tutto ok fino a quando dopo aver implementato un sistema di upload di immagini noto che il server in cui risiede l’applicazione va in bomba dopo ogni upload (che possono essere anche multipli) :-|


Ma che cavolo è? Un accurato trace mi identifica il colpevole: Directory.Delete()!

Dopo ogni upload io eliminavo una cartella temporanea di appoggio e questo comando (anche la rinomina di una cartella) genera un recycle del worker process IIS… e nel mio caso causava la rigenerazione della cache per ogni file uploadato!

Come risolvere?

  • o non si elimina la cartella (brutto e dove starebbe il divertimento :-)
  • Mr Google mi fa trovare questo blog (Haissam [MCAD]) in cui propone una soluzione attraverso Reflection.

Basta aggiungere questa parte di codice nell’Application_Start del** 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[] { }); 

Ricordando di importare il name space System.Reflection.


Marco Valsecchi

"Man is still the most extraordinary computer of all" (J.F. Kennedy)