防止许多不同的MVC URL填充ASP.NET缓存

Teu*_*n D 6 .net memory asp.net asp.net-mvc

我们的网站使用ASP.NET MVC作为其中的一部分页面.这些URL的格式通常为http://oursite/detail.mvc/12345/pictures/在此URL中,12345是数据库中的ID.我们有几十万个对象,我们为其显示详细页面.最近我们注意到该网站的内存使用量有所增加,所以我调查了一下.我们对生产站点进行了内存转储,发现大量的内存使用量是由"dmachine/webroot/1/site/detail.mvc/12345/pictures /"和"H"形式的Cache中的字符串引起的. :\网站\ detail.mvc\12345 \图片\".

进一步研究和大量使用Reflector表明这些字符串以System.Web.CachedPathData对象的形式存储在ASP.NET Cache中.这是ConfigurationManager在从web.config文件中读取信息时创建的.它调用HttpContext.GetSection() - > HttpContext.GetConfigurationPathData() - > CachedPathData.GetVirtualPathData().最后,在CachedPathData.GetConfigPathData中,确定所请求路径的虚拟路径,并将其缓存在ASP.NET缓存中而不会过期.

现在麻烦的是我们有数百万个不同的URL,并且对于每个路径,配置系统在缓存中存储了许多字符串(configPath,虚拟路径,物理路径).随着时间的推移,这些信息消耗几百MB,几乎所有缓存中的数据.

我假设当内存稀缺时,这些条目将被删除,但在操作中,它们不信任增长和增长的进程​​.它似乎也非常低效.有没有办法告诉HttpContext不要为每个唯一的URL缓存此信息?或者我们可以先将请求路径映射到一个更简单的URL,然后用它来选择正确的web.config?

Jan*_*oom 1

好吧,我想了一下(Teun 和我在同一家公司工作),据我所知,我们有两个选择:

  1. 没做什么。本文包含一位 ASP.NET 团队人员的评论,它展示了几种防止缓存不断增长的方法:http://forums.asp.net/p/985551/3297967.aspx#3297967,但是并没有解决为每个可能的路由写入缓存条目的问题,但保证缓存不会抛出一些内存不足异常。

  2. 使用解决方法解决问题,使用查询字符串参数而不是固定路由(/controller.mvc?action=X¶ms=Y 而不是controller.mvc/action/params)。这样只有controller.mvc被缓存。

毕竟,我不认为这真的是一个问题。

  • 选项 2 看起来相当蹩脚,因为它扼杀了 ASP.NET mvc 框架最好、最明显的功能之一。在我们的例子中,这并不重要,因为我们也有一个 ISAPI 重写 dll。但这似乎仍然是一个蹩脚的解决方案。 (2认同)