【发布时间】:2010-11-28 03:56:27
【问题描述】:
我们网站的部分页面使用 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?
【问题讨论】:
标签: .net asp.net asp.net-mvc memory