Asp.net mvc MVC甜甜圈缓存在联机部署后无法按预期工作

Asp.net mvc MVC甜甜圈缓存在联机部署后无法按预期工作,asp.net-mvc,asp.net-mvc-4,caching,donut-caching,Asp.net Mvc,Asp.net Mvc 4,Caching,Donut Caching,我们正在使用MVC甜甜圈缓存,整天都在尝试调试这个问题,但我仍然没有找到解决方案 我们选择开始在OutputCache上使用DonutOutputCache属性,通过日志记录,我们注意到某些具有DonutOutputCache属性的局部视图操作没有按照缓存参数进行缓存 我们有一个包含以下嵌套局部视图的视图(索引)。具有指定的圆环缓存属性的文件列在方括号中 _LayoutMainBase.cshtml _标题(局部视图) _车头底部行程(局部视图) _HeaderMainMenu(Pari

我们正在使用MVC甜甜圈缓存,整天都在尝试调试这个问题,但我仍然没有找到解决方案

我们选择开始在OutputCache上使用DonutOutputCache属性,通过日志记录,我们注意到某些具有DonutOutputCache属性的局部视图操作没有按照缓存参数进行缓存

我们有一个包含以下嵌套局部视图的视图(索引)。具有指定的圆环缓存属性的文件列在方括号中

  • _LayoutMainBase.cshtml
    • _标题(局部视图)
      • _车头底部行程(局部视图)
        • _HeaderMainMenu(ParialView)
          [DonutOutputCache(持续时间=3600)]
    • RenderBody()(HomeController.Index)
      [DonutOutputCache(Duration=3600)]
通过日志记录,我们发现在不到一小时的时间内,实际上多次调用了_HeaderMainMenu部分视图操作

这并没有发生:

  • 如果我们恢复到OutputCache属性
  • 在我们的工作站上进行本地测试时
对原因有什么见解吗


谢谢你的帮助

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

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

  • 前缀
  • 控制器名称
  • 动作名称
  • Querystring参数值(取决于
    CacheSettings.Options
    是否启用了
    OutputCacheOptions.IgnoreQueryString
    标志)
  • 表单参数(取决于
    CacheSettings.Options
    是否启用了
    OutputCacheOptions.IgnoreFormData
    标志)
  • 路线值
  • 如果将
    VaryByParam
    属性设置为:
    • none
      ,则清除所有查询字符串/表单/路由值
    • 如果你把它设置成除了<代码> */COD>之外的任何东西,那么它只会考虑这些参数仅
  • VaryByCustom
    参数将在
    System.Web.HttpApplication
    中调用相同的
    GetVaryByCustomString
    密钥生成器
上面生成的密钥给我们带来了问题,因为在我们不知道这些参数的情况下生成了一个不同的密钥。由于这个原因,这些方法被多次调用,因为网站位于产品服务器、用户、搜索引擎、机器人和其他请求上,传递的querystring/form/route值不同,因此生成了一个新密钥


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

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

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

  • 前缀
  • 控制器名称
  • 动作名称
  • Querystring参数值(取决于
    CacheSettings.Options
    是否启用了
    OutputCacheOptions.IgnoreQueryString
    标志)
  • 表单参数(取决于
    CacheSettings.Options
    是否启用了
    OutputCacheOptions.IgnoreFormData
    标志)
  • 路线值
  • 如果将
    VaryByParam
    属性设置为:
    • none
      ,则清除所有查询字符串/表单/路由值
    • 如果你把它设置成除了<代码> */COD>之外的任何东西,那么它只会考虑这些参数仅
  • VaryByCustom
    参数将在
    System.Web.HttpApplication
    中调用相同的
    GetVaryByCustomString
    密钥生成器
上面生成的密钥给我们带来了问题,因为在我们不知道这些参数的情况下生成了一个不同的密钥。由于这个原因,这些方法被多次调用,因为网站位于产品服务器、用户、搜索引擎、机器人和其他请求上,传递的querystring/form/route值不同,因此生成了一个新密钥

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