24 giugno 2010

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

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.