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#?
-
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.
-
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.
-
I've found the answer I was looking for:
HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");Brettski : does anyone know if something like this is available for classic ASP? -
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.
-
Hi, why not use the sqlcachedependency on the posts table?
This way your not implementing custom cache clearing code and simply refreshing the cache as the content changes in the db?
-
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.
0 comments:
Post a Comment