Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to switch off caching for MVC requests but not for static files in IIS7?

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)?

like image 731
Carvellis Avatar asked Nov 02 '10 13:11

Carvellis


1 Answers

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.

like image 175
stevemegson Avatar answered Oct 22 '22 01:10

stevemegson