【问题标题】:Prevent many different MVC URLs from filling ASP.NET Cache防止许多不同的 MVC URL 填充 ASP.NET 缓存
【发布时间】: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


    【解决方案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 似乎相当蹩脚,因为它扼杀了 ASP.NET mvc 框架中最好和最明显的功能之一。在我们的例子中,这并不重要,因为我们也有一个 ISAPI 重写 dll。但这似乎仍然是一个蹩脚的解决方案。
    猜你喜欢
    • 2012-02-20
    • 2018-12-25
    • 2020-05-05
    • 1970-01-01
    • 2023-03-09
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多