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