Like the question says, I wanted to know if it's possible to turn off caching on all controllers and actions for my entire site. Thanks!
How do I turn off caching for my entire ASP.NET MVC 3 website?
Asked Answered
Create a Global Action Filter and override OnResultExecuting()
:
public class DisableCache : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
}
}
And then register this in your global.asax, like so:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new DisableCache());
}
In summation, what this does is create a Global Action Filter so that implicitly this will be applied to all Controllers and all Actions.
Thanks for your reply. How about scripts, images and css? would the global action filter affect those too? In other words does an action filter only get called for requests to controllers/actions or on every request? Like @AdamTuliper mentioned, I wouldn't want to cache those –
Gaultheria
@Gaultheria Hmmm... after testing it out it looks like images and css still cache with this global action filter. I'd have to research how to prevent this. –
Arguseyed
Nevermind, apparently that's the very definition of an actionfilter that they only run on requests to actions –
Gaultheria
@Gaultheria Right, exactly. Maybe this is something that needs to be handled on the client-side..? –
Arguseyed
Well I'm not really concerned with scripts, images and css being cached. I kind of don't have the time to dig deeper into the matter but if the time comes when I don't want to cache my scripts images and css (sensitive logos?) I'll ask another question, :-). Thank! –
Gaultheria
Update for MVC4: This approach works nicely with bundling and minification. HTML pages aren't cached, but resources such as bundled scripts and CSS are still cached. –
Pushbike
In MVC 5 and other MVCs the
RegisterGlobalFilters
could be in App_Start\FilterConfig.cs
–
Carleton You should add this method to your Global.asax.cs file
protected void Application_BeginRequest(object sender, EventArgs e)
{
Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AddHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AddHeader("Expires", "0"); // Proxies.
}
This disables cache on every request (images, html, js etc.).
Yes, depending on the approach you take. I like applying the actions to a base controller (hence my reply there). You could implement the filter at the link below and implement it as a global filter as well (registered in your global.asax.cs)
In web.config you can add additional headers to go out with every response
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Cache-control" value="no-cache"/>
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
© 2022 - 2024 — McMap. All rights reserved.