![]() |
Web Development »
Caching »
General
Intermediate
License: The GNU General Public License (GPL)
ASP.NET MVC Result CacheBy Jorge Bay GondraCache the ActionResult using an ActionFilter |
C#.NET 3.5, ASP.NET, Architect, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
The idea behind this cache approach is plain simple: the web application should cache ActionResults that demand heavy CPU/DB time to load. Currently, the ASP.NET MVC Framework has a cache feature, the OutputCache, that works by storing a copy of the resulting webpage. This feature does not fit a scenario where the webpage is dependant, for example, on session data.
Add the ResultCache attribute to an action of a controller.
[ResultCache(Duration=60)]
public ActionResult About()
{
//code that demands heavy CPU/DB time to execute
//...
ViewData["DummyData"] = dummy;
return View();
}
Here is the ViewPage code:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<h2>About</h2>
<p>
Sample ViewData value: <%=ViewData["DummyData"]%>
</p>
<p>
Sample Session dependant data <%=Session["UserName"] %>
</p>
The code in the ViewPage is not affected by using the ResultCache. In the sample, the View shows the data from the ViewData (can be cached) and the Session.
After the Action executes, the Action Filter stores the ActionResult in the application Cache.
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//Add the ActionResult to cache
filterContext.HttpContext.Cache.Add(this.CacheKey, filterContext.Result,
Dependency, DateTime.Now.AddSeconds(Duration),
System.Web.Caching.Cache.NoSlidingExpiration, Priority, null);
//Add a value in order to know the last time it was cached.
filterContext.Controller.ViewData["CachedStamp"] = DateTime.Now;
base.OnActionExecuted(filterContext);
}
The next time the Action is invoked, the attribute will retrieve the result from cache preventing the Action from executing.
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string url = filterContext.HttpContext.Request.Url.PathAndQuery;
this.CacheKey = "ResultCache-" + url;
if (filterContext.HttpContext.Cache[this.CacheKey] != null)
{
//Setting the result prevents the action itself to be executed
filterContext.Result =
(ActionResult)filterContext.HttpContext.Cache[this.CacheKey];
}
base.OnActionExecuting(filterContext);
}
This cache approach is used in the open source MVC site prsync.com.
Get the full source code of the site at CodePlex.
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 17 Feb 2009 Editor: Deeksha Shenoy |
Copyright 2009 by Jorge Bay Gondra Everything else Copyright © CodeProject, 1999-2009 Web20 | Advertise on the Code Project |