我们正在使用MVC Donut Caching,并且整天都在尝试调试这个问题,我仍然无法找到解决方案。
我们已选择开始在OutputCache上使用DonutOutputCache属性,并且通过日志记录已注意到,根据缓存参数,某些具有DonutOutputCache属性的部分视图操作未被缓存。
我们有一个带有以下嵌套部分视图的View(索引)。具有指定的环形缓存属性的那些列在方括号中。
[DonutOutputCache(Duration = 3600)]
[DonutOutputCache(Duration = 3600)]
通过记录,我们发现_HeaderMainMenu部分视图操作实际上在不到一个小时的时间内被多次调用。
这种情况没有发生:
对可能是什么原因的任何见解?
谢谢你的帮助!
答案 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
,并解决了这个问题。