We all have user controls that appear on every page (a perfect example of this - a header control or a navigation control). User controls can very easily be cached using the
OutputCache
directive:
<%@ OutputCache duration="3600"%>
By embedding the above tag into a user control, it will be cached for an hour. But what if the data it displays changes during the course of the hour? How do I ensure that the data will be updated in a timely manner? The simple solution is in the
VaryByCustom
attribute of the tag.VaryByCustom
calls a special function called GetVaryByCustomString
and passes it the value you specify for the VaryByCustom
attribute in the OutputCache
tag. Essentially you write the code to determine what value gets returned. With each subsequent request for the cached object, the ASP.Net engine first checks the result GetVaryByCustomString
function. If the result has changed - regardless of the duration on the Cache, the system will bypass the cache and execute the code in the control.Therefore, it is very easy to set up, say, an application variable that gets changed only when the data gets changed, then use the
GetVaryByCustomString
function to check for updates.So your
OutputCache
line will now look like this:
<%@ OutputCache duration="3600" VaryByCustom="updateCheck"%>
Then make the following changes to your
Global.asax
:- Add the following line to your
Application_Start
method:
Application["lastUpate"]=DateTime.Now.ToString(); - Add the following code as the function
GetVaryByCustomString
:
public override string GetVaryByCustomString(HttpContext context,string arg)
{
if(arg=="serial")
{
return Application["serial"].ToString();
}
//We need to return an empty string so that this compiles
return "";
}
Now you are almost done. All you still need to do to ensure that your cached pages are updated when data changes is to make the following call:
Application["lastUpate"]=DateTime.Now.ToString();
This will update the application variable, and change the result of the
GetVaryByCustomString
function, which will force the Cache to update.
No comments:
Post a Comment