Ich habe ein seltsames Problem mit ASP.NET MemoryCaching in einer MVC 3 ASP.NET-Anwendung.
Jedes Mal, wenn eine Aktion ausgeführt wird, überprüfe ich, ob ihre LoginInfo tatsächlich im MemoryCache gespeichert ist (der Code wurde vereinfacht, aber der Kern ist wie folgt):
%Vor%Die GetLoginInfo ist:
%Vor%Die SetLoginInfo ist:
%Vor%Der Code ist ziemlich einfach, aber manchmal (völlig zufällig), direkt nach dem Hinzufügen der LoginInfo zum MemoryCache, das Ergebnis ist leer, das gerade hinzugefügte Objekt ist nicht vorhanden, daher habe ich die Ausnahme erhalten.
Ich teste das sowohl auf Cassini als auch auf IIS 7, es scheint nichts mit der Wiederverwendbarkeit von AppPools zu tun (aktiviert in IIS 7), ich habe es mit mehreren Caching-Richtlinien getestet, kann es aber nicht funktionieren
Was vermisse ich / fehlgeschlagen?
PS: verzeih mir mein schlechtes Englisch
Ich glaube, Sie stoßen auf ein Problem, das Scott Hanselman als einen .NET 4-Fehler identifiziert hat. Siehe hier: MemoryCache Empty: Gibt nach dem Setzen
null zurückWenn Sie den Code für MemoryCache mit einem Dekompilierer betrachten, gibt es die folgende private Funktion
%Vor% Es gibt einen unbehandelten Exception-Handler, der von jedem MemoryCache für die aktuelle Domäne Thread.GetDomain()
eingerichtet wurde. Wenn also in Ihrer Anwendung irgendeine Exception auftritt, die auf einer Webseite üblich ist, wird der MemoryCache für immer freigegeben und kann nicht mehr sein Reused Dies ist besonders relevant für IIS-Anwendungen wie für Windows-Anwendungen, die nur mit Ausnahmen ohne Handhaben beendet werden.
Der MemoryCache hat eine begrenzte Größe. Für die Standard -Instanz ist die Heuristik nicht Wert (nach MSDN ).
Haben Sie versucht, die Eigenschaft Priorität in CacheItemPolicy -Instanz auf NotRemovable zu setzen?
Sie können race-condition haben, weil die Sequenz Contains-Remove-Add in SetLoginInfo nicht atomar ist - versuchen Sie Stellen Sie stattdessen die Methode ein.
Übrigens. Sie arbeiten an einer Webanwendung, warum sollten Sie System.Web.Caching.Cache nicht verwenden? stattdessen?
Tags und Links asp.net-mvc c#-4.0