Clearing Page Cache in ASP.NET

C#asp.netOutputcache

C# Problem Overview


For my blog I am wanting to use the Output Cache to save a cached version of a perticular post for around 10 minutes, and thats fine...

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

However, if someone posts a comment, I want to clear the cache so that the page is refreshed and the comment can be seen.

How do I do this in ASP.Net C#?

C# Solutions


Solution 1 - C#

I've found the answer I was looking for:

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

Solution 2 - C#

The above are fine if you know what pages you want to clear the cache for. In my instance (ASP.NET MVC) I referenced the same data from all over. Therefore, when I did a [save] I wanted to clear cache site wide. This is what worked for me: http://aspalliance.com/668

This is done in the context of an OnActionExecuting filter. It could just as easily be done by overriding OnActionExecuting in a BaseController or something.

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

Setup:

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

Minor Tweak: I have a helper which adds "flash messages" (Error messages, success messages - "This item has been successfully saved", etc). In order to avoid the flash message from showing up on every subsequent GET, I had to invalidate after writing the flash message.

Clearing Cache:

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

Hope this helps.

Solution 3 - C#

Using Response.AddCacheItemDependency to clear all outputcaches.

  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);
    }

This is also can be used in ASP.NET MVC's OutputCachedPage.

Solution 4 - C#

On the master page load event, please write the following:

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

and in the logout button click:

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

Solution 5 - C#

Hmm. You can specify a VaryByCustom attribute on the OutputCache item. The value of this is passed as a parameter to the GetVaryByCustomString method that you can implement in global.asax. The value returned by this method is used as an index into the cached items - if you return the number of comments on the page, for instance, each time a comment is added a new page will be cached.

The caveat to this is that this does not actually clear the cache. If a blog entry gets heavy comment usage, your cache could explode in size with this method.

Alternatively, you could implement the non-changeable bits of the page (the navigation, ads, the actual blog entry) as user controls and implement partial page caching on each of those user controls.

Solution 6 - C#

If you change "*" to just the parameters the cache should vary on (PostID?) you can do something like this:

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

and when someone adds a comment...

Cache.Remove(key);

I guess this would work even with VaryByParam *, since all requests would be tied to the same cache dependency.

Solution 7 - C#

why not use the sqlcachedependency on the posts table?

sqlcachedependency msdn

This way your not implementing custom cache clearing code and simply refreshing the cache as the content changes in the db?

Solution 8 - C#

HttpRuntime.Close() .. I try all method and this is the only that work for me

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGateKillerView Question on Stackoverflow
Solution 1 - C#GateKillerView Answer on Stackoverflow
Solution 2 - C#KevinView Answer on Stackoverflow
Solution 3 - C#View Answer on Stackoverflow
Solution 4 - C#Mohd AdilView Answer on Stackoverflow
Solution 5 - C#John ChristensenView Answer on Stackoverflow
Solution 6 - C#palmseyView Answer on Stackoverflow
Solution 7 - C#Brian ScottView Answer on Stackoverflow
Solution 8 - C#JulienView Answer on Stackoverflow