避免在回发时执行缓存控件

时间:2012-03-15 10:25:57

标签: asp.net c#-4.0 web-controls outputcache

我有一个自定义博客页面,在页面的右侧,我有一个“面板”,显示最受欢迎的博客,另一个是上周在他们的博客上投票最多的人和另外三个这样的东西。这些面板都是sql重;它们需要几秒钟才能加载。

这里是布局的粗略概述: enter image description here

使用Balsamiq

创建的

模型

由于它们不会经常变化,我将它们全部隔离到webcontrols(.ascx)中并且它们都有一个输出缓存:

<%@ OutputCache Duration="7200" VaryByParam="*" VaryByCustom="CacheByModule" %>

global.asax中我得到了与我的自定义缓存变量匹配的内容:

    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
    switch (custom.ToLower())
    {
        case "cachebymodule":
            Request.Url.PathAndQuery.Split('/')[0];
            break;
    }

            return base.GetVaryByCustomString(context, custom);
    }

我基本上对网站的不同部分,博客,民意调查,调查,测验等做同样的事情。

当我第一次运行我的页面时,所有这些页面都被执行 - 这是预期的。 在下一次运行中 - 没有一个被执行,这也是预期的。

现在,每次都会发生这种情况 - 当我在博客上发表评论或回复时,这是一个回发事件,我正在使用ajax更新面板进行评论部分,我的所有右侧面板都在执行!

我怎么知道这个?好吧,如果我调试应用程序,它们中的断点正在被回复和删除(回发事件)。 SQL事件探查器显示的次数与确认值的两倍相同。

这是预期的行为吗?缓存它们的全部意义在于它们永远不会被执行..但是,每次回复和删除都会被执行。只有在没有执行它们的时候才会进行新页面加载(并且在缓存时间限制内)

那么,为什么它会在回发中被执行? 我该怎么办呢?

由于

1 个答案:

答案 0 :(得分:2)

执行它的原因是因为PageLoad / PostBack的URL +参数不相同,因此输出缓存不起作用。
您可以尝试设置OutputCache VaryByParam="None",以避免在URL更改时重置。

<%@ OutputCache Duration="7200" VaryByParam="None" VaryByCustom="CacheByModule" %>

取决于CacheByModule正在做什么,这应该有用。

相关问题