I'm developing an ASP.NET MVC application. Most of the controller actions are not supposed to be cached. Because of this I output no-cache headers in Application_BeginRequest
:
protected void Application_BeginRequest()
{
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
}
The application is running on IIS7 with modules config setting runAllManagedModulesForAllRequests="true"
. This means that all static files pass through the request pipeline as well (and get caching disabled).
What is the best way to keep caching enabled for these static files? Do I have to check on extension before setting the response cache headers in Application_BeginRequest
or is there an easier way (like bypassing the request pipeline for static files altogether)?
Assuming that you can't avoid using runAllManagedModulesForAllRequests="true"
as in Hector's link, you could check the type of the request handler and only set the caching headers if the request is being handled by MVC.
protected void Application_PreRequestHandlerExecute()
{
if ( HttpContext.Current.CurrentHandler is MvcHandler )
{
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
}
}
Note that I've moved the code into Application_PreRequestHandlerExecute
because the handler hasn't yet been chosen in BeginRequest
, so HttpContext.Current.CurrentHandler
is null.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With