【问题标题】:MVC Donut Caching not working as expected once deployed online在线部署后,MVC 甜甜圈缓存无法按预期工作
【发布时间】:2013-11-29 08:15:55
【问题描述】:

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

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

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

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

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

这不会发生:

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

对可能的原因有什么见解吗?

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多