51

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

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

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

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

4

8 回答 8

49

我找到了我正在寻找的答案:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
于 2008-08-14T20:04:36.290 回答
41

如果您知道要清除缓存的页面,则上述内容很好。在我的实例(ASP.NET MVC)中,我引用了来自各地的相同数据。因此,当我执行 [save] 时,我想清除站点范围内的缓存。这对我有用: 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);
}

小调整:我有一个助手,它添加了“闪存消息”(错误消息、成功消息 - “此项目已成功保存”等)。为了避免 flash 消息出现在每个后续的 GET 中,我必须在写完 flash 消息后使其无效。

清除缓存:

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

希望这可以帮助。

于 2010-05-20T18:24:31.887 回答
6

使用 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 中使用。

于 2009-01-06T13:55:03.047 回答
3

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

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

并在注销按钮中单击:

Session.Abandon();
Session.Clear();
于 2011-06-22T12:24:06.220 回答
1

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

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

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

于 2008-08-14T19:51:50.683 回答
1

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

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

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

Cache.Remove(key);

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

于 2008-08-14T19:55:31.847 回答
1

为什么不在posts 表上使用sqlcachedependency?

sqlcache依赖msdn

这样你就没有实现自定义缓存清除代码,只是随着数据库中内容的变化而刷新缓存?

于 2010-01-02T00:17:48.347 回答
-1

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

于 2011-01-18T18:55:57.207 回答