Le chiavi della cache di Httpruntime non sono univoche?
Domanda
Anche se ho specificato una chiave univoca, sembra che il seguente codice restituirà un valore per 5 richieste, quindi un altro per la coppia successiva, quindi tornerà al valore salvato nella richiesta originale e continuerà fino a quando non ci sono 10 di oggetti diversi tutti memorizzati nella stessa chiave. Sembra quindi quasi casuale quale di questi valori tornerà dalla cache.
string strDateTime = string.Empty;
string cachename = "datetimeexample";
object cachedobject = HttpRuntime.Cache.Get(cachename);
if (cachedobject != null)
strDateTime = (string)cachedobject;
else
{
strDateTime = DateTime.Now.ToString();
HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null);
}
Response.Write(strDateTime +" keys:"+ HttpRuntime.Cache.Count);
Molto confuso, è a causa del threading o qualcosa del genere?
Soluzione
Ignorando la possibilità di una server farm e il bilanciamento del carico, questo comportamento può essere causato dal pool di applicazioni in esecuzione come web-garden . Per citare la sezione pertinente da MSDN:
Perché i giardini Web consentono l'uso di più processi, ogni processo sarà avere una propria copia dell'applicazione stato, stato sessione in-process, cache e dati statici. Giardini Web non dovrebbe essere usato per tutti applicazioni, specialmente se ne hanno bisogno per mantenere lo stato. Essere sicuri di benchmark delle prestazioni del domanda prima di decidere se La modalità Web Garden è appropriata.
Ciò farà apparire come se la memorizzazione nella cache memorizzi più valori per la stessa chiave, con effettivamente voci duplicate nella cache.
Per risolvere questo problema in IIS 7, apri le Impostazioni avanzate del pool di applicazioni e imposta Processi di lavoro massimi su 1. Per IIS 6, vedi Articolo MSDN (con schermate graziose).
Anche se con 8 mesi di ritardo, sto rispondendo a questa domanda perché l'ho trovata molto prima di aver trovato questo articolo decente su gotchas web-garden . Spero che questa risposta salverà i futuri ricercatori un po 'di tempo. :)
Altri suggerimenti
La tua chiave di cache è sempre "datetimeexample", quindi avrai sempre un oggetto nella cache; e riceverai sempre quell'oggetto indietro.
Non sono del tutto sicuro di ciò che stai cercando di realizzare qui, per quanto mi riguarda, questo si comporta esattamente come dovrebbe fare.