Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止许多不同的MVC URL填充ASP.NET缓存_.net_Asp.net_Asp.net Mvc_Memory - Fatal编程技术网

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

防止许多不同的MVC URL填充ASP.NET缓存,.net,asp.net,asp.net-mvc,memory,.net,Asp.net,Asp.net Mvc,Memory,我们的网站部分页面使用ASP.NETMVC。这些URL通常具有此URL中的形式,12345是数据库中的ID。我们有几十万个对象,我们为它们显示详细信息页面。最近,我们注意到该站点的内存使用量有所增加,所以我进行了一些调查。我们对生产站点进行了内存转储,发现缓存中的字符串“dmachine/webroot/1/site/detail.mvc/12345/pictures/”和“H:\site\detail.mvc\12345\pictures\”导致了大量内存使用 进一步调查和大量使用Reflec

我们的网站部分页面使用ASP.NETMVC。这些URL通常具有此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、virtual path、physical path)。随着时间的推移,这些信息消耗了数百MB,这是缓存中的大部分数据

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

我仔细考虑过(Teun和我在同一家公司工作),我们有两个选择:

  • 什么也不做。本文包含一位asp.net团队成员的评论,并展示了几种防止缓存不断增长的方法:,但并没有解决为每个可能的路由写入缓存项的问题,而是保证缓存不会抛出一些内存不足异常

  • 使用变通方法解决此问题,使用querystring参数代替固定路由(/controller.mvc?action=X¶ms=Y代替controller.mvc/action/params)。这样,只缓存controller.mvc


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

    选项2看起来相当蹩脚,因为它扼杀了ASP.NET mvc框架中最优秀、最明显的功能之一。在我们的例子中,这并不重要,因为我们也有一个ISAPI重写dll。但这似乎仍然是一个站不住脚的解决方案。