2009-09-14 41 views
6

我们的网站使用ASP.NET MVC作为其中的一部分页面。这些URL通常具有以下格式:http://oursite/detail.mvc/12345/pictures/在此URL中,12345是数据库中的ID。我们有几十万个对象,为此我们显示详细页面。最近我们注意到网站内存使用量的增加,所以我调查了一下。我们做了一个生产站点的内存转储,发现大量的内存使用是由形式为“dmachine/webroot/1/site/detail.mvc/12345/pictures /”和“H :\网站\ detail.mvc \ 12345 \图片\”。防止许多不同的MVC URL填充ASP.NET缓存

进一步调查和大量使用反射已经表明,这些字符串存储在ASP.NET缓存在System.Web.CachedPathData对象的形式。这是由ConfigurationManager在从web.config文件读取信息时创建的。它调用HttpContext.GetSection() - > HttpContext.GetConfigurationPathData() - > CachedPathData.GetVirtualPathData()。最终,在CachedPathData.GetConfigPathData中,将为请求的路径确定虚拟路径,并将其缓存在ASP.NET缓存中而不会失效。

现在的问题是,我们有几百万不同的网址,并为每个路径配置系统存储了一些在高速缓存中的字符串(用configPath,虚拟路径,物理路径)的。随着时间的推移,这些信息会消耗几百MB,几乎全部缓存中的数据。

我认为当内存变得稀缺,这些条目将被删除,但在操作他们不相信,成长过程和成长。这看起来效率很低。有没有办法告诉HttpContext不要为每个唯一的URL缓存这些信息?或者,也许我们可以先将请求路径映射到更简单的URL,然后用它来选择正确的web.config?

回答

1

嗯,我考虑了一下(师德和我在同一家公司工作),我们有两种选择,据我可以告诉:

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

  2. 问题解决了与变通方法,使用查询字符串参数,而不是固定的路线(/controller.mvc?action=X & PARAMS = Y代替controller.mvc /动作/ PARAMS)。这样只有controller.mvc被缓存。

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

+2

选项2似乎有些跛,因为它杀死的ASP.NET MVC框架的最好的,最明显的特征之一。在我们的例子中,这并不重要,因为我们也有一个ISAPI重写DLL。但它似乎仍然是一个蹩脚的解决方案。 – 2009-09-15 06:45:35