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

6
我们的网站在部分页面中使用ASP.NET MVC。这些URL通常采用以下形式:http://oursite/detail.mvc/12345/pictures/ 在此URL中,12345是数据库中的ID。我们有数十万个对象需要展示详细页面。最近,我们注意到网站的内存使用量上升,因此我进行了一些调查。我们对生产网站进行了内存转储,并发现缓存中形如“dmachine/webroot/1/site/detail.mvc/12345/pictures/”和“H:\site\detail.mvc\12345\pictures\”的字符串占用了总内存使用量的相当大一部分。

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

现在的问题是,我们有数百万个不同的URL,对于每个路径,配置系统都会在缓存中存储一些字符串(configPath、虚拟路径、物理路径)。随着时间的推移,这些信息会占用数百MB的空间,几乎是缓存中所有数据的总和。

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

1

好的,我已经考虑过了(Teun和我在同一家公司工作),就我所知,我们有两个选择:

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

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

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


2
选项2似乎相当糟糕,因为它会破坏ASP.NET MVC框架中最好、最显著的特性之一。在我们的情况下,这并不重要,因为我们已经安装了一个ISAPI重写dll。但它仍然看起来像是一个糟糕的解决方案。 - Teun D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接