2009-03-23 14 views
0

J'ai un système d'autorisation et de menustructure combiné sur notre backend. Pour des raisons de performances, la mise en cache EntLib est utilisée dans le client frontal (site Web MVC rel 1.0, IIS 5.1 local, serveur IIS 6.0, pas de cluster). Parfois, Cache.Contains retournera true, mais le contenu du cache est NULL. Je sais avec certitude que je l'ai rempli correctement, alors quel peut être le problème ici?Entlib Cache.Contains NULL problème

EDIT: lorsque je mets le cache à 1 minute et ajoute la clé cache 'A_Key', je verrai la clé revenir lors de l'inspection de CurrentCacheState. Lorsque je vois CurrentCacheState après 2 minutes, la clé est toujours là. Quand j'exécute 'contains', true est renvoyé. Quand j'exécute à nouveau 'contient', le cacheKey est parti! Problème de synchronisation?

Cordialement, Michel

Extrait:

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

Et le 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))); 
    } 
} 

Répondre

0

j'ai obtenu la réponse suivante Avanade (créateurs de Entlib):

Très probablement, the BackgroundScheduler n'a pas encore effectué son balayage. Si vous allez examiner la source code, la méthode Contains vérifie uniquement si la clé spécifique est présente dans le cache inmemory Hashtable tandis que sur la méthode GetData , le code vérifie d'abord si l'article est arrivé à expiration, si il a, l'élément est supprimé du cache.

Sarah Urmeneta Global Technology Solutions & Avanade, Inc. [email protected]

Cette solution fonctionne pour moi. Encore la question demeure pourquoi vous pouvez utiliser «Contient» quand son résultat ne peut pas être utilisé d'une manière sensible.

Cordialement, M.

1

Merci Michael pour suivre votre propre question, j'ai été coincé avec toute la journée que si j'identifier essayer de récupérer un élément de cache cela est dû expirer (+ 0 jusqu'à à 25 secondes) j'obtiendrai une valeur NULL. Codeplex a posté une solution de contournement (de toutes sortes) comme il est dans leur FAQ:

a. Comment éviter d'obtenir une valeur nulle à partir du CacheManager lors de l'actualisation de l'élément? - Par intermittence, vous pouvez rencontrer cette situation. Pour contourner ce problème, créez votre propre implémentation d'un ICacheItemExpiration. Dans la méthode HasExpired(), implémentez une logique qui vérifiera si l'élément a déjà expiré et mettra à jour la valeur de l'élément s'il a expiré. Cette méthode doit toujours renvoyer false pour que l'élément ne soit pas étiqueté comme expiré. En retour de false dans la méthode HasExpired(), l'élément ne sera pas actualisé et contiendra la valeur mise à jour comme implémentée dans la méthode. REF: link