1

关于 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")只能一起工作,禁用其中一个会使事情看起来和以前完全一样——输出缓存没有变化。

4

1 回答 1

0

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

于 2013-03-06T11:58:24.230 回答