2009-03-23 5 views
0

Ich habe ein kombiniertes Autorisierungs- und Menüstruktursystem auf unserem Backend. Aus Leistungsgründen wird das EntLib-Caching im Frontend-Client verwendet (MVC rel 1.0-Website, IIS 5.1 lokal, IIS 6.0-Server, kein Cluster).Entlib Cache.Contains NULL Problem

Manchmal gibt 'Cache.Contains' den Wert true zurück, aber der Inhalt des Cache ist NULL. Ich weiß mit Sicherheit, dass ich es richtig ausgefüllt habe. Was kann das Problem sein?

BEARBEITEN: wenn ich den Cache auf 1 Minute setze und den CacheKey 'A_Key' hinzufüge, sehe ich den Schlüssel, der zurückkommt, wenn ich den CurrentCacheState untersuche. Wenn ich CurrentCacheState nach 2 Minuten anzeigen, ist der Schlüssel immer noch vorhanden. Wenn ich 'contains' ausführe, wird true zurückgegeben. Wenn ich 'contains' erneut ausführe, ist der cacheKey weg! Synchronisationsproblem ??

Grüße, Michel

Auszug:

if (IntranetCaching.Cache.Contains(cacheKey)) 
{ 
    menuItems = (List<BoMenuItem>)IntranetCaching.Cache[cacheKey]; 
} 
else 
{ 
    using (AuthorizationServiceProxyHelper authorizationServiceProxyHelper = new AuthorizationServiceProxyHelper()) 
    { 
     menuItems = authorizationServiceProxyHelper.Proxy.SelectMenuByUserAndApplication(APPNAME, userName, AuthorizationType.ENUM_LOGIN); 
     IntranetCaching.Add(cacheKey, menuItems); 
    } 
} 

Und der cachehelper:

public static class IntranetCaching 
{ 
    public static ICacheManager Cache { get; private set; } 

    static IntranetCaching() 
    { 
     Cache = CacheFactory.GetCacheManager(); 
    } 

    public static void Add(string key, object value) 
    { 
     Cache.Add(
      key 
      , value 
      , CacheItemPriority.Normal 
      , null 
      , new Microsoft.Practices.EnterpriseLibrary.Caching.Expirations.AbsoluteTime(TimeSpan.FromMinutes(10))); 
    } 
} 

Antwort

0

ich die folgende Antwort von Avanade bekam (Schöpfer von EntLib):

Höchstwahrscheinlich Der BackgroundScheduler hat seinen Sweep noch nicht durchgeführt. Wenn Sie gehen die Quelle Code zu untersuchen, enthält die Methode nur prüft, ob die speziellen Schlüssel im inmemory Cache hashtable vorhanden ist, während auf der GetData-Methode, die Code überprüft zunächst , wenn das Element abgelaufen ist, wenn Es hat das Element wird aus dem Cache entfernt.

Sarah Urmeneta Global Technology & Lösungen Avanade Inc. [email protected]

Diese Lösung ist für mich arbeiten. Noch bleibt die Frage, warum Sie "Enthält" verwenden können, wenn das Ergebnis nicht sinnvoll verwendet werden kann.

Grüße, M.

1

Danke Michael für Ihre eigene Ausgabe Verfolgung, habe ich damit den ganzen Tag zu identifizieren, dass stecken geblieben, wenn ich ein Element aus Cache versuchen und abrufen dies ist darauf zurückzuführen, verfallen (+ 0 bis bis 25 Sekunden) Ich bekomme einen NULL-Wert. Codeplex hat eine Art Problemumgehung (wie es in ihren FAQ steht) gepostet:

a. Wie vermeide ich, einen NULL-Wert aus dem CacheManager zu erhalten, wenn das Element aktualisiert wird? - Unter Umständen können Sie auf diese Situation stoßen. Um dies zu umgehen, erstellen Sie eine eigene Implementierung eines ICacheItemExpiration. Implementieren Sie in der HasExpired() -Methode eine Logik, die überprüft, ob das Element bereits abgelaufen ist, und den Wert des Elements aktualisieren, wenn es abgelaufen ist. Diese Methode sollte immer false zurückgeben, damit das Element nicht als abgelaufen markiert wird. Als Ergebnis der Rückgabe von false in der HasExpired() -Methode wird das Element nicht aktualisiert und enthält den aktualisierten Wert wie in der Methode implementiert. REF: link

Verwandte Themen