Frage

Auch wenn ich einen eindeutigen Schlüssel angegeben habe, so scheint es, der folgende Code einen Wert für 5 Anfragen zurück, dann noch für die nächste, dann auf den Wert wieder zurück in der ursprünglichen Anforderung gespeichert und einfach weiter, bis es 10 sind ist von verschiedene Objekte alle unter dem gleichen Schlüssel gespeichert. Es scheint dann fast zufällig, welche diese Werte aus dem Cache zurück.

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);

Sehr verwirrt, dann ist dies wegen Threading oder etwas?

War es hilfreich?

Lösung

Das Ignorieren der Möglichkeit einer Serverfarm und Load-Balancing, kann dieses Verhalten durch den Anwendungspool verursacht wird ausgeführt als Web-Garten . Um den entsprechenden Abschnitt von MSDN zu zitieren:

  

Da Webgärten ermöglichen den Einsatz von   mehrere Prozesse, wird jeder Prozess   haben eine eigene Kopie der Anwendung   Zustand, in-Process-Sitzungszustand,   Caches und statische Daten. Webgärten   sollten nicht alle verwendet werden   Anwendungen, vor allem, wenn sie benötigen,   aufrechtzuerhalten Zustand. Sicher sein zu   Benchmark die Leistung der   Anwendung, bevor sie entscheidet, ob   Webgarten Modus geeignet ist.

Dies führt dazu, es zu erscheinen, als ob Caching mehrere Werte für den gleichen Schlüssel speichert, effektiv mit doppelten Einträgen im Cache.

Um dies zu beheben in IIS 7, öffnen Sie das Anwendungspool Erweiterte Einstellungen und stellen Sie Maximale Arbeitsprozesse zu 1. Für IIS 6 finden Sie in der MSDN-Artikel (mit hübsche Screenshots).

Wenn auch 8 Monate zu spät, ich bin der Beantwortung dieser Frage, weil ich es gefunden, lange bevor ich gefunden diesen anständigen Artikel über Web-Garten gotchas . Hoffentlich wird diese Antwort wird künftig Forscher ein Stück Zeit sparen. :)

Andere Tipps

Ihre CacheKey ist immer ‚datetimeexample‘, daher werden Sie immer ein Objekt im Cache; und Sie werden immer das Objekt zurück erhalten.

Ich bin mir nicht ganz sicher, was Sie hier versuchen zu erreichen, so weit es mich betrifft, dies verhält sich genau so, wie es soll tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top