J'ai un problème avec une application MVC 3 qui utilise le nouveau System.Runtime.Caching MemoryCache de .NET 4. J'ai remarqué qu'après un temps apparemment imprévisible, il arrête de mettre en cache des choses et agit comme s'il était vide. Considérez ce bout de code que j'ai pris directement d'une vue de test dans ASP.NET MVC :
MemoryCache.Default.Set("myname","fred", new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0,5,0) });
Response.Write(MemoryCache.Default["myname"]);
Quand ça marche, comme on peut s'y attendre, "fred" est imprimé. Cependant, lorsque le problème commence à se poser, malgré la présence de Set()
la valeur de MemoryCache.Default["myname"]
est nulle. Je peux le prouver en plaçant un point d'arrêt sur la fonction Response.Write()
et de définir et lire directement le cache en utilisant la fenêtre immédiate - Il ne le définit pas et reste nul ! La seule façon de le faire fonctionner à nouveau est de provoquer un recyclage de l'AppDomain.
Il est intéressant de noter que je peux provoquer le problème alors que l'application fonctionne normalement, en cassant le bouton Response.Write()
la ligne et la course MemoryCache.Default.Dispose()
. Après cela, MemoryCache.Default n'est pas lui-même nul (pourquoi ?), mais il n'enregistre rien de ce qu'il contient. Cela ne provoque pas d'erreur, mais n'enregistre rien du tout.
Quelqu'un peut-il le vérifier et l'expliquer ? Comme je crois l'avoir découvert, lorsque l'application cesse de fonctionner d'elle-même, quelque chose est en train de disposer MemoryCache.Default
mais ce n'est pas moi !
UPDATE
Eh bien, j'en ai marre de ce problème maintenant ! CLRProfiler ne semble pas fonctionner avec MVC 3. L'outil CLR de SciTech était bon - tout comme RedGate ANTS. Mais tout ce qu'ils m'ont dit, c'est que l'objet MemoryCache est éliminé par quelque chose ! J'ai également prouvé (via une impression d'horodatage) qu'une PartialView de ma page qui devrait être mise en cache (spécifiée par OutputCacheAttribute) cesse d'être mise en cache après quelques minutes - elle commence à se rafraîchir à chaque appel de la page. Pour clarifier l'environnement, je fonctionne directement sur le serveur IIS 7.5 sur ma station de travail de développement fonctionnant sous Win 7 Ultimate. Les outils de mémoire mentionnés ci-dessus suggèrent que je n'utilise qu'environ 9 mb de mémoire en termes d'objets en jeu.
En désespoir de cause, j'ai modifié mon code de mise en cache pour qu'il recherche d'abord un HttpContext ambiant auquel s'accrocher et utilise sa fonctionnalité de mise en cache, si elle est disponible. Les premiers tests montrent que c'est fiable, mais cela ressemble à une mauvaise manipulation.
J'ai l'impression que MemoryCache et OutputCache ne sont pas justifiés pour fonctionner avec MVC 3...