重写的GetVaryByCustomString方法仅在第一次请求页面时被调用

时间:2013-03-06 08:02:24

标签: asp.net outputcache c1-cms

我对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秒)。 虽然在60秒内cookie可能已在客户端更改 - 但页面只是从缓存中获取。

我哪里错了? 提前谢谢。

更新 我终于能够通过CacheProfile设置中的以下修改使得outputcache因cookie而异:

<outputCacheProfiles>
   <add name="C1Page" duration="60" varyByCustom="C1Page" varyByParam="*" varyByHeader="Cookie" location="Server" />
</outputCacheProfiles>

在这种情况下,每个请求都会遇到GetVaryByCustomString方法,但不需要它:这些设置会使缓存因网站上可能设置的每个cookie而异。当然,这不是一种理想的行为 - 这就是我继续调查的原因。

更有趣的是 - 这两个参数(varyByHeader =“Cookie”和位置=“服务器”)只能一起工作,禁用其中一个使事情看起来与之前完全一样 - outputcache没有变化。

1 个答案:

答案 0 :(得分:0)

尝试给Application_BeginRequest设置一个断点,可能是浏览器没有提出请求,而是显示一个缓存页面。