我在Webuser控件(.ascx)上使用OutputCache

<%@ OutputCache Duration="1000" VaryByParam="none" %>

我想在接下来的1000秒钟内保留缓存,但是当加载网站上的特定页面时,我想删除/刷新/刷新缓存。就像,我想在加载MyPage.aspx时清除缓存。我可以以编程方式刷新缓存吗?

它只有一页是高速缓存,因此没有参数化版本可以刷新高速缓存。

感谢您的帮助。

最佳答案

您可以为此使用 VaryByCustom 参数。

在用户控件中,您将具有以下内容:

<%@ OutputCache Duration="1000" VaryByParam="None" VaryByCustom="MyKey" %>

然后,您将像这样在Global.asax中覆盖 GetVaryByCustomString 方法:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
    if (arg == "MyKey")
    {
        object o = context.Current.Application["MyGuid"];
        if (o == null)
        {
            o = Guid.NewGuid();
            context.Current.Application["MyGuid"] = o;
        }
        return o.ToString();
    }
    return base.GetVaryByCustomString(context, arg);
}

最后,在MyPage.aspx中,您可以这样做:
Application["MyGuid"] = Guid.NewGuid();

如何运作?

每当您的控件被缓存时,它就会与一个字符串相关联(当您的控件的GetVaryByCustomString键传递给它时,从VaryByCustom方法返回的字符串)。

每当随后使用该控件时,就会再次调用GetVaryByCustomString。如果返回的字符串与控件的缓存版本匹配,则使用该缓存版本。

在我们的例子中,“MyKey”被传递到GetVaryByCustomString中,并返回存储在Application["MyGuid"]中的任何内容。

每当调用MyPage.aspx时,它将Application["MyGuid"]更改为新的随机值。

下次使用控件时,GetVaryByCustomString方法将返回新值,并且由于没有与该值关联的控件的缓存版本,因此将重新生成控件。 (然后,该控件将被缓存并与新值相关联,以保留到下一次调用MyPage.aspx等时为止)

有一个概述here

08-27 23:13