【问题标题】:Dynamically disable/enable outputcache for a page during runtime在运行时动态禁用/启用页面的输出缓存
【发布时间】:2015-10-28 02:06:38
【问题描述】:

我正在使用名为 Composite C1 的 CMS 系统。它通过单个页面 (Page.aspx) 呈现其所有内容,该页面附加了一个自定义输出缓存配置文件。

这一切都很好,但我遇到了问题。

我想要缓存,但我想禁用某些 URL 的输出缓存。

我知道可以添加到缓存配置文件中的 varybycustom 属性,但我不认为这会完全满足我的需求。我希望能够在访问特定 URL(或者可能是其他一些情况)时完全禁用缓存。

这似乎非常棘手,因为每个页面/url 都通过单个 Page.aspx 文件呈现,并定义了它的 outputcache 配置文件。

有人对我如何解决这个问题有任何建议吗?

【问题讨论】:

  • 我想知道自定义 OutputCacheProvider 是否可能是一个潜在的答案。试图找到默认提供者的来源......这被证明是一项相当艰巨的任务,即使有反射也是如此。
  • 您的其他页面是否也存在 OutputCache 指令??
  • 好吧,除了管理页面,我并不担心。但是所有的前端都是通过 Page.aspx 呈现的。 Page.aspx.cs 读取 url,然后从数据存储中获取适当的页面并呈现它。所以所有的前端 URL 都使用相同的 aspx 页面进行渲染。
  • 您说 Page.aspx.cs 会读取 url,然后获取相应的页面。所以这意味着有从 QueryString 推断的信息?像 ...aspx?id=5
  • 不只是querystring no,更多的是跟URL解释有关。所有 URL 都通过同一个 Page.aspx 页面进行路由和呈现。这就是复合 C1 的工作原理。这实际上效果很好,但是很难控制缓存,因为它对所有页面都是开/关的。 :)

标签: asp.net caching outputcache c1-cms


【解决方案1】:

\Global.asax 中,您会发现GetVaryByCustomString 的覆盖,它调用复合C1 来评估是否应缓存响应。您可以进行干预,并且仅在请求不是针对您不希望缓存的 URL 之一时才调用 Composite:

if (context.Request.Url.AbsolutePath != "/dont-cache-this")
{
    return ApplicationLevelEventHandlers.GetVaryByCustomString(context, custom) ?? base.GetVaryByCustomString(context, custom);
}

return null;

请注意,稍后升级 Composite C1 可能会替换 \Global.asax 并擦除您的更改。

另见http://msdn.microsoft.com/en-us/library/5ecf4420.aspx

【讨论】:

  • 您是否 100% 确定这不会缓存?仅使用基本自定义字符串,这不会仍然缓存吗?我原以为允许或不触发缓存的方法会返回一个布尔值。
  • 如果请求的路径不应该被缓存,我已经更新了我的答案以返回 null。正如您所提到的,返回基本自定义字符串没有任何好处。
  • 太棒了,谢谢马格努斯。我只是对这个实现进行了一些彻底的测试,以确保它能够完全按预期执行。我会根据结果将此标记为答案。
【解决方案2】:

您可以将以下代码插入到不应缓存的页面上的函数中。或者添加一个可以做到这一点的小函数:

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多