1

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

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

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

  • _LayoutMainBase.cshtml
    • _Header(部分视图)
      • _HeaderBottomStrip(部分视图)
        • _HeaderMainMenu (ParialView)[DonutOutputCache(Duration = 3600)]
    • RenderBody() (HomeController.Index)[DonutOutputCache(Duration = 3600)]
    • ...

通过日志记录,我们发现_HeaderMainMenu Partial View Action 实际上在不到一个小时的时间内被多次调用。

这没有发生:

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

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

谢谢你的帮助!

4

1 回答 1

4

在下载并检查了MVC Donut Caching项目的源代码后,我们终于找到了发生这种情况的原因。

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

  • 字首
  • 控制器名称
  • 动作名称
  • 查询字符串参数值(取决于设置CacheSettings.OptionsOutputCacheOptions.IgnoreQueryString标志)
  • 表单参数(取决于设置CacheSettings.OptionsOutputCacheOptions.IgnoreFormData标志)
  • 路线价值
  • 如果您将VaryByParam属性设置为:
    • none,然后所有的查询字符串/表单/路由值都被清除
    • 如果您将它设置为除 之外的任何内容*,那么它只会考虑这些参数
  • VaryByCustom参数最终会GetVaryByCustomStringSystem.Web.HttpApplication.

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

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

于 2013-11-19T11:14:52.157 回答