2009-09-14 5 views
6

Notre site Web utilise ASP.NET MVC pour une partie des pages qu'il contient. Ces URL ont généralement la forme http://oursite/detail.mvc/12345/pictures/ Dans cette URL, le 12345 est un ID dans la base de données. Nous avons plusieurs centaines de milliers d'objets pour lesquels nous montrons des pages de détails. Récemment, nous avons remarqué une augmentation de l'utilisation de la mémoire pour le site, donc j'ai enquêté un peu. Nous avons fait un vidage de mémoire du site de production et avons constaté qu'une quantité importante de l'utilisation totale de la mémoire était causée par des chaînes dans le cache du formulaire "dmachine/webroot/1/site/detail.mvc/12345/images /" et "H : \ site \ detail.mvc \ 12345 \ images \ ". Une recherche plus approfondie et une utilisation intensive de Reflector ont montré que ces chaînes sont stockées dans le cache ASP.NET sous la forme d'un objet System.Web.CachedPathData. Ceci est créé par ConfigurationManager lorsqu'il lit les informations du fichier web.config. Il appelle HttpContext.GetSection() -> HttpContext.GetConfigurationPathData() -> CachedPathData.GetVirtualPathData(). Finalement, dans CachedPathData.GetConfigPathData, le chemin virtuel est déterminé pour le chemin demandé et ceci est mis en cache dans le cache ASP.NET sans expiration. Maintenant, le problème est que nous avons des millions d'URL différentes, et pour chaque chemin, le système de configuration stocke un certain nombre de chaînes (configPath, chemin virtuel, chemin physique) dans le cache. Au fil du temps, cette information consomme plusieurs centaines de Mo, presque toutes les données dans le cache. Je suppose que lorsque la mémoire se fait rare, ces entrées seront supprimées, mais dans les opérations, elles ne font pas confiance aux processus qui grandissent et se développent. Cela semble également très inefficace. Existe-t-il un moyen de dire à HttpContext de ne pas mettre en cache ces informations pour chaque URL unique? Ou peut-être pouvons-nous d'abord mapper le chemin de la requête vers une URL plus simple et l'utiliser pour sélectionner le fichier web.config correct?Empêcher de nombreuses URL MVC différentes de remplir le cache ASP.NET

Répondre

1

Eh bien, je pensais au-dessus (Teun et je travaille dans la même entreprise), et nous avons deux options pour autant que je peux dire:

  1. Ne rien faire. Cet article contient un commentaire d'un gars de l'équipe asp.net, et il montre quelques façons d'empêcher la croissance et la croissance du cache: http://forums.asp.net/p/985551/3297967.aspx#3297967, mais ne résout pas le problème de l'écriture d'une entrée de cache pour chaque route possible, mais garantit que le cache ne génère pas d'exception de mémoire insuffisante.

  2. résoudre le problème avec une solution de contournement, utiliser des paramètres querystring au lieu de liaisons fixes (/controller.mvc?action=X & params = Y à la place de controller.mvc/action/params). De cette façon, seul controller.mvc est mis en cache.

Après tout, je ne pense pas que ce soit vraiment un problème.

+2

L'option 2 semble plutôt boiteuse, car elle tue l'une des fonctionnalités les plus belles et les plus visibles de la structure ASP.NET mvc. Dans notre cas, cela n'aurait pas d'importance, car nous avons aussi un système de réécriture ISAPI. Mais cela semble toujours une solution boiteuse. –

Questions connexes