一旦在线部署,MVC Donut Caching就无法正常工作

时间:2013-11-15 19:56:17

标签: asp.net-mvc asp.net-mvc-4 caching donut-caching

我们正在使用MVC Donut Caching,并且整天都在尝试调试这个问题,我仍然无法找到解决方案。

我们已选择开始在OutputCache上使用DonutOutputCache属性,并且通过日志记录已注意到,根据缓存参数,某些具有DonutOutputCache属性的部分视图操作未被缓存。

我们有一个带有以下嵌套部分视图的View(索引)。具有指定的环形缓存属性的那些列在方括号中。

  • _LayoutMainBase.cshtml
    • _Header(PartialView)
      • _HeaderBottomStrip(PartialView)
        • _HeaderMainMenu(ParialView)[DonutOutputCache(Duration = 3600)]
    • RenderBody()(HomeController.Index)[DonutOutputCache(Duration = 3600)]
    • ...

通过记录,我们发现_HeaderMainMenu部分视图操作实际上在不到一个小时的时间内被多次调用。

这种情况没有发生:

  • 如果我们恢复为OutputCache属性
  • 在我们的工作站进行本地测试时

对可能是什么原因的任何见解?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

下载并检查MVC Donut Caching项目的源代码后,我们终于找到了解决这个问题的原因。

此项目中定义的DonutOutputCache属性使用IKeyBuilder生成用于存储输出HTML的缓存键。项目附带的默认DevTrends.MvcDonutCaching.KeyBuilder类生成一个由以下内容组成的键。以下部分:

  • 前缀
  • 控制器名称
  • 行动名称
  • 查询字符串参数值(取决于设置了CacheSettings.Options标志的OutputCacheOptions.IgnoreQueryString
  • 表单参数(取决于设置了CacheSettings.Options标志的OutputCacheOptions.IgnoreFormData
  • 路线值
  • 如果您将VaryByParam属性设置为:
    • none,然后清除所有查询字符串/表单/路由值
    • 如果您将其设置为除*之外的任何内容,那么它只会考虑此类参数
  • VaryByCustom参数最终会在GetVaryByCustomString内调用相同的System.Web.HttpApplication密钥生成器。

上面生成的密钥对我们造成了问题,因为当我们不知道这些参数时,正在生成一个不同的密钥。出于这个原因,这些方法被多次调用,因为网站是在产品服务器,用户,搜索引擎,机器人和其他具有不同查询字符串/表单/路由值的请求上传递的,因此生成了新密钥。

我们的解决方案是创建我们自己的自定义IKeyBuilder,而不是默认的IKeyBuilder,并解决了这个问题。