Some customers look for a way to set global caching policy for static content. This article provides information on a way to move forward implementing that option.
In these cases we recommend using a global asax to perform additional measures as sampled below. This code would be added to a global asax in the site root.
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
Dictionary<String, HttpCookie> cookieCollection = new Dictionary<string, HttpCookie>();
for (int i = HttpContext.Current.Request.Cookies.Count - 1; i >= 0; i--)
{
HttpCookie c = HttpContext.Current.Request.Cookies.Get(i);
if (!cookieCollection.ContainsKey(c.Name))
{
cookieCollection.Add(c.Name, c);
}
}
HttpContext.Current.Items.Add("RequestCookieCollection", cookieCollection);
}
void Application_PostRequestHandlerExecute(object sender, EventArgs e)
{
Dictionary<String, HttpCookie> cookieCollection = new Dictionary<string, HttpCookie>();
for (int i = HttpContext.Current.Response.Cookies.Count - 1; i >= 0; i--)
{
HttpCookie c = HttpContext.Current.Response.Cookies.Get(i);
if (!cookieCollection.ContainsKey(c.Name))
{
cookieCollection.Add(c.Name, c);
}
}
HttpContext.Current.Items.Add("ResponseCookieCollection", cookieCollection);
Response.Cookies.Clear();
}
void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
System.Web.HttpCacheability cachelevel = System.Web.HttpCacheability.Private;
if (Request.FilePath.ToLower().StartsWith("/uploadedimages")) cachelevel = System.Web.HttpCacheability.Public;
//if (Request.FilePath.ToLower().StartsWith("/uploadedassets")) cachelevel = System.Web.HttpCacheability.Public;
if (Request.FilePath.ToLower().EndsWith(".js")) cachelevel = System.Web.HttpCacheability.Public;
if (Request.FilePath.ToLower().EndsWith(".css")) cachelevel = System.Web.HttpCacheability.Public;
if (Request.FilePath.ToLower().EndsWith(".gif")) cachelevel = System.Web.HttpCacheability.Public;
if (Request.FilePath.ToLower().EndsWith(".png")) cachelevel = System.Web.HttpCacheability.Public;
if (Request.FilePath.ToLower().EndsWith(".jpg")) cachelevel = System.Web.HttpCacheability.Public;
if (HttpContext.Current.Items.Contains("ResponseCookieCollection"))
{
Dictionary<String, HttpCookie> ResponseCookieCollection = (Dictionary<String, HttpCookie>)HttpContext.Current.Items["ResponseCookieCollection"];
if (HttpContext.Current.Items.Contains("RequestCookieCollection"))
{
Dictionary<String, HttpCookie> RequestCookieCollection = (Dictionary<String, HttpCookie>)HttpContext.Current.Items["RequestCookieCollection"];
foreach (HttpCookie c in ResponseCookieCollection.Values)
{
if (!RequestCookieCollection.ContainsKey(c.Name) || RequestCookieCollection[c.Name].Value != c.Value)
{
HttpContext.Current.Response.Cookies.Add(c);
cachelevel = System.Web.HttpCacheability.Private;
}
}
}
}
if (cachelevel == System.Web.HttpCacheability.Public) Response.Cache.SetCacheability(cachelevel);
}
Additional options for max-age code can be found here.
This code segment in particular has relevance. Setting max-age in PreSendRequestHeaders worked.
var staticExtensions = new List<string> { ".js", ".css", ".jpg", ".gif", ".png" };
if(staticExtensions.Any(ext => Request.FilePath.ToLower().EndsWith(ext)))
{
Response.Cache.SetMaxAge(TimeSpan.FromDays(7));
}
Please sign in to leave a comment.