Je suis confronté à un problème étrange avec ASP.NET ModyCaching dans une application mvc 3 ASP.NET.
Chaque fois qu'une action est exécutée, je vérifie si son logininfo est réellement stocké dans le cachemaque (code a été simplifié. , mais le noyau est comme suit): p> Le getlogininfo est le suivant: p> Le SetLoginInfo est: p> Le code est assez simple, mais parfois (totalement aléatoirement), juste après avoir ajouté le logininfo au matièresCache, ce résulte vide, l'objet juste ajouté n'est pas présent, donc j'ai eu l'exception . P> Je teste cela à la fois sur Cassini et IIS 7, il semble ne pas lié à la réutilisabilité de l'Applool (activé dans IIS 7), j'ai testé avec plusieurs politiques de mise en cache, mais je ne peux pas le faire fonctionner P> Qu'est-ce que je manque / défaillant? P> PS: Pardonne-moi pour mon mauvais anglais P> P>
3 Réponses :
Le MemoryCache em> a une taille limitée. Pour le Par défaut instance, est ' t valeur heuristique em> (selon MSDN ) . p>
Avez-vous essayé de définir priorité em> propriété sur cacheItempolicy em> instance notreMovable em>? p>
Vous pouvez avoir une condition de course car la séquence contenant-supprimer-ajouter dans setlogininfo em> n'est pas atomique - essayez d'utiliser Set Méthode à la place. P>
BTW. Vous travaillez sur la demande Web, alors pourquoi ne pas utiliser Système. Web.caching.cache à la place? P>
Salut Augi. Long time a passé depuis que j'ai demandé cela, le code n'est pas à jour, je vais le réparer dès que possible. En fait, nous avons changé notre stratégie de mise en cache à des tables de base de données simples. Ifrc j'ai essayé aussi à l'aide de la méthode définie et du système.web.caching.cache sans succès. Cependant, dans les prochaines semaines, je dois travailler sur une nouvelle application MVC et je vais essayer de tenter cela. . (Je prévois beaucoup de mise en cache mais sur un serveur de cache dédié, ce sera amusant). Cependant +1 pour donner de bonnes notes. Merci.
Regarder le code pour MemoryCache en utilisant une fonction privée décrive la fonction privée suivante
private void OnUnhandledException(object sender, UnhandledExceptionEventArgs eventArgs) { if (!eventArgs.IsTerminating) return; this.Dispose(); }
Intéressant. Nous avons supprimé le cache pour l'instant, dès que nous avons du budget à dépenser sur cette application, je vérifierai cela.
Je pense que vous rencontrez un problème que Scott Hanselman est identifié comme un bogue .NET 4. S'il vous plaît voir ici: MemoryCache vide: renvoie NULL après avoir été défini P>
Vous avez probablement raison, cette question a été ouverte depuis si longtemps que je l'ai presque oubliée. Sur notre application, nous avons simplement changé l'architecture pour éviter l'utilisation de cache.
Avez-vous une méthode appelée
getlogininfo code> et
getlogindata code> ou est-ce une faute de frappe?
Avez-vous confirmé
logindata.userlogin (utilisateur.entity.name); code> ne renvoie pas null?
@DannyTuppeny: Nom différent pour Setter / Getter est une faute de frappe dans ma pâte CUT'N. La méthode userLogin ne renvoie pas NULL, elle se lit à partir d'un profil d'utilisateurs de tableaux de DB, BTW, CROIST vérifié avec l'inspection de toutes les variables. Je soupçonne que mon entrée dans le cache est disposée par quelque chose juste après que je l'ajoute. Je vais essayer d'ajouter un removecallback pour voir si c'est le cas.
@Bigmike, ressemble à
memorycache.default code> est périmé. Êtes-vous sûr de ne pas connaître une condition de course entre deux threads? Par exemple,
get () code> pourrait se produire sur le thread a entre
Supprimer () code> et
ajouter () code> sur le fil B.
@ Frédéricamidi n'a pas pensé à ce scénario, peut être une bonne idée. En réalité, l'application s'exécute dans ASP.NET App Pool (et s'ils n'avaient pas changé cela, devrait être un bassin de fil du même processus IIS). Je vais enquêter sur ce avenir dès que je serai de retour au travail. Merci.
De plus, si vous êtes faible sur la mémoire ou quelque chose comme ça, les choses pourraient être supprimées du cache immédiatement?
@DannyTuppeny: L'objet entier est de quelques centaines d'octets et lors de tests, je suis en cours d'exécution avec 10/15 faux utilisateurs. La machine cible est un serveur PreProd avec des tonnes de RAM. Peut-être qu'il y a quelques paramètres dans .net pour définir l'espace initial de cache?
@Bigmike malheureusement, je ne sais pas vraiment beaucoup de la cache. Je viens de voir des problèmes sur l'un de nos systèmes où Thigns était immédiatement i> expulsé de cache en bass ram :(