为什么Outputcache过早过期?

时间:2017-12-22 08:52:12

标签: c# asp.net

我有一个ASP.NET Webforms应用程序。为了获得更好的性能,我以编程方式在主页的页面加载中设置Outputcache:

    protected void Page_Load(object sender, EventArgs e)
    {
        // [...] do stuff [...]

        if (!Page.IsPostBack)
        {
            Response.Cache.SetCacheability(HttpCacheability.Server);
            Response.Cache.SetValidUntilExpires(true);  // ignore Cache-Control Header from Request
            Response.Cache.SetSlidingExpiration(false);
            Response.Cache.VaryByParams["*"] = true;
            Response.Cache.SetExpires(somedateinthefuture); // plus 5 Days from now
            Response.AddFileDependency(pathtoafile);        // a file which will be overwritten when cache should be fully cleared (this works)
        }
}

因此,对于每个唯一的Url,HTML都会被缓存。这很好用。

问题:

  • 许多条目在距离缓存1或3分钟后随机删除,尽管它应该持续很多天
  • 有些参赛作品会停留24小时或更长时间,但也会在拍摄前被删除

我检查了什么:

  • 依赖关系文件尚未更新
  • IIS-Application或Application-Pool尚未重新启动或回收
  • 池的记忆不是最多
  • 在测试网站上输出缓存比生产网站
  • 长得多
  • 单个项目过期,而不是整个缓存
  • 按" STRG + F5"重新加载被叫站点
  • IIS 7.5,ASP.NET 4.6.1

什么可能导致删除单个缓存项。也许Bots?但是不应该通过SetValidUntilExpires(true)阻止这种情况吗?

1 个答案:

答案 0 :(得分:1)

原因是IIS7-Application中的设置。当应用程序池的大小超过400兆字节时,它会自行回收或删除单个缓存条目。