关于 ASP.Net 或 Composite C1 CMS 中的 outputcache 工作,我有以下问题(不知道问题出在哪里):
我需要通过名为“City”的 cookie 来改变缓存。在 Global.asax 中,我重写了 GetVaryByCustomString 方法。
public override string GetVaryByCustomString(HttpContext context, string custom)
{
var result = ApplicationLevelEventHandlers.GetVaryByCustomString(context, custom);
if (result == null) {
return base.GetVaryByCustomString(context, custom);
}
HttpCookie cookie = context.Request.Cookies["City"];
string additionalVary = "";
if (cookie != null)
additionalVary = cookie.Value;
else
additionalVary = "Москва";
return String.Concat(result, additionalVary);
}
问题是:我重写的 GetVaryByCustomString 方法的断点仅在对页面的第一个请求时被击中,但在缓存实际过期(在我的情况下为 60 秒)之前不会在下一个请求上被击中。虽然 cookie 可能在这 60 秒内在客户端发生了更改,但该页面只是从缓存中获取的。
我哪里错了?提前致谢。
更新: 我终于能够通过 CacheProfile 设置中的以下修改使 outputcache 因 cookie 而异:
<outputCacheProfiles>
<add name="C1Page" duration="60" varyByCustom="C1Page" varyByParam="*" varyByHeader="Cookie" location="Server" />
</outputCacheProfiles>
在这种情况下,GetVaryByCustomString 方法在每个请求上都会被命中,但没有必要:这些设置使缓存因网站上可能设置的每个 cookie 而异。当然,这不是一种理想的行为——这就是我继续调查的原因。
更有趣的是——这两个参数(varyByHeader="Cookie" 和 location="Server")只能一起工作,禁用其中一个会使事情看起来和以前完全一样——输出缓存没有变化。