清除 ASP.NET 中的页面缓存

Clearing Page Cache in ASP.NET

提问人:GateKiller 提问时间:8/15/2008 最后编辑:Pure.KromeGateKiller 更新时间:11/2/2012 访问量:108649

问:

对于我的博客,我想使用输出缓存将特定帖子的缓存版本保存大约 10 分钟,这很好......

<%@OutputCache Duration="600" VaryByParam="*" %>

但是,如果有人发表评论,我想清除缓存,以便刷新页面并可以看到评论。

如何在 ASP.Net C# 中执行此操作?

C# asp.net OutputCache

评论


答:

1赞 John Christensen 8/15/2008 #1

嗯。可以在 OutputCache 项上指定 VaryByCustom 属性。此值将作为参数传递给可在 global.asax 中实现的 GetVaryByCustomString 方法。此方法返回的值用作缓存项的索引 - 例如,如果返回页面上的注释数,则每次添加注释时都会缓存一个新页面。

需要注意的是,这实际上不会清除缓存。如果博客条目被大量使用评论,则使用此方法可能会使缓存大小爆炸。

或者,可以将页面的不可更改位(导航、广告、实际博客条目)实现为用户控件,并在每个用户控件上实现部分页面缓存。

1赞 palmsey 8/15/2008 #2

如果将“*”更改为缓存应随其变化的参数(PostID?),则可以执行以下操作:

//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);

当有人添加评论时......

Cache.Remove(key);

我想这甚至可以使用 VaryByParam *,因为所有请求都将绑定到相同的缓存依赖项。

49赞 GateKiller 8/15/2008 #3

我找到了我一直在寻找的答案:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");

评论

0赞 Brettski 9/22/2008
有谁知道这样的东西是否可用于经典 ASP?
0赞 GateKiller 12/9/2010
我不认为缓存在 ASP 中可用,所以不抱歉。
0赞 Sam Salim 11/26/2015
这将清除该页面的每个参数的所有缓存。
2赞 Mohammad Dayyan 1/12/2016
我使用的是 MVC 5.2.3,我应该在哪里编写此代码?
0赞 Neha Thakur 12/17/2016
我正在将 Web 用户控件用于动态菜单,我正在使用 outputcache 并希望在注销时删除缓存,我使用了您的解决方案并传递了我的用户控件的路径,但对我不起作用。
6赞 1/6/2009 #4

使用 Response.AddCacheItemDependency 清除所有输出缓存。

  public class Page : System.Web.UI.Page
  {
    protected override void OnLoad(EventArgs e)
    {
        try
        {
            string cacheKey = "cacheKey";
            object cache = HttpContext.Current.Cache[cacheKey];
            if (cache == null)
            {
              HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
            }

            Response.AddCacheItemDependency(cacheKey);
        }
        catch (Exception ex)
        {
            throw new SystemException(ex.Message);
        }

        base.OnLoad(e);
    }     
 }



  // Clear All OutPutCache Method    

    public void ClearAllOutPutCache()
    {
        string cacheKey = "cacheKey";
        HttpContext.Cache.Remove(cacheKey);
    }

这也可用于 ASP.NET MVC 的 OutputCachedPage。

评论

0赞 Sam Salim 11/26/2015
完美,这就是我要找的。你只应该改变一件事。HttpContext.Current.Cache.Remove(cacheKey);
1赞 Brian Scott 1/2/2010 #5

为什么不对 Posts 表使用 SqlCacheDependency?

sqlcachedependency MSDN

这样,您就不会实现自定义缓存清除代码,而只是在数据库中的内容发生变化时刷新缓存吗?

41赞 Kevin 5/21/2010 #6

如果您知道要清除缓存的页面,以上就可以了。在我的实例(ASP.NET MVC)中,我引用了来自各地的相同数据。因此,当我执行[保存]时,我想清除整个站点的缓存。这对我有用:http://aspalliance.com/668

这是在 OnActionExecuting 筛选器的上下文中完成的。通过在 BaseController 或其他东西中重写 OnActionExecuting 可以很容易地完成。

HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");

设置:

protected void Application_Start()
{
    HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}

小调整: 我有一个助手,它添加了“闪光消息”(错误消息、成功消息 - “此项目已成功保存”等)。为了避免闪光消息出现在随后的每个 GET 中,我不得不在编写闪消息后失效。

清除缓存:

HttpRuntime.Cache.Insert("Pages", DateTime.Now);

希望这会有所帮助。

评论

4赞 Andrei M 8/19/2011
Ir 仅适用于整个页面缓存。它不适用于子操作。有什么建议吗?
3赞 bobek 12/7/2012
和.maz你弄清楚了吗?
0赞 marapet 3/26/2013
@and.maz 如果您知道如何为子操作执行此操作,这里有赏金。
0赞 Dave Lawrence 6/25/2013
这对我不起作用。这种无法清除缓存元素似乎是 mvc 中的一个巨大缺点
0赞 user2173353 12/11/2013
可能,您无法清除缓存,因为您使用 @Html.Action() 来呈现部分视图。您必须使用来清除整个“子操作缓存”(对于所有子操作 - 如果不使用库,似乎没有更好的方法)。dotnet.dzone.com/articles/programmatically-clearing-0OutputCacheAttribute.ChildActionCache = new MemoryCache("NewRandomStringNameToClearTheCache");
-1赞 Julien 1/19/2011 #7

HttpRuntime.Close()..我尝试了所有方法,这是唯一对我有用的方法

评论

7赞 GateKiller 2/11/2011
我怀疑这是在关闭 IIS 上的 ASP.NET 申请流程。这似乎有点过分,可能会清除所有缓存,并且在大型网站上会出现严重的性能问题。
3赞 Mohd Adil 6/22/2011 #8

在母版页加载事件中,请编写以下内容:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

并在注销按钮中单击:

Session.Abandon();
Session.Clear();