Disabling browser caching for all browsers from ASP.NET

115,401

Solution 1

This is what we use in ASP.NET:

// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

// Stop Caching in Firefox
Response.Cache.SetNoStore();

It stops caching in Firefox and IE, but we haven't tried other browsers. The following response headers are added by these statements:

Cache-Control: no-cache, no-store
Pragma: no-cache

Solution 2

For what it's worth, I just had to handle this in my ASP.NET MVC 3 application. Here is the code block I used in the Global.asax file to handle this for all requests.

    protected void Application_BeginRequest()
    {
        //NOTE: Stopping IE from being a caching whore
        HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetValidUntilExpires(true);
    }

Solution 3

I've tried various combinations and had them fail in FireFox. It has been a while so the answer above may work fine or I may have missed something.

What has always worked for me is to add the following to the head of each page, or the template (Master Page in .net).

<script language="javascript" type="text/javascript">
    window.onbeforeunload = function () {   
        // This function does nothing.  It won't spawn a confirmation dialog   
        // But it will ensure that the page is not cached by the browser.
    }  
</script>

This has disabled all caching in all browsers for me without fail.

Solution 4

There are two approaches that I know of. The first is to tell the browser not to cache the page. Setting the Response to no cache takes care of that, however as you suspect the browser will often ignore this directive. The other approach is to set the date time of your response to a point in the future. I believe all browsers will correct this to the current time when they add the page to the cache, but it will show the page as newer when the comparison is made. I believe there may be some cases where a comparison is not made. I am not sure of the details and they change with each new browser release. Final note I have had better luck with pages that "refresh" themselves (another response directive). The refresh seems less likely to come from the cache.

Hope that helps.

Share:
115,401
ANISH S NAIR
Author by

ANISH S NAIR

Full stack (code and infrastructure) Tech Lead

Updated on July 14, 2022

Comments

  • ANISH S NAIR
    ANISH S NAIR almost 2 years

    I'm after a definitive reference to what ASP.NET code is required to disabled browsers from caching the page. There are many ways to affect the HTTP headers and meta tags and I get the impression different settings are required to get different browsers to behave correctly. It would be really great to get a reference bit of code commented to indicate which works for all browsers and which is required for particular browser, including versions.

    There is a huge amount of information about this issue there but I have yet to find a good reference that describes the benefits of each method and whether a particular technique has been superseded by a higher level API.

    I'm particularly interested in ASP.NET 3.5 SP1 but it would be good to get answers for earlier version as well.

    This blog entry Two Important Differences between Firefox and IE Caching describes some HTTP protocol behaviour differences.

    The following sample code illustrates the kind of thing I am interested in

    public abstract class NoCacheBasePage : System.Web.UI.Page
    {
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
    
            DisableClientCaching();
        }
    
        private void DisableClientCaching()
        {
            // Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1">
            // HTTP Headers or both?
    
            // Does this only work for IE?
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
    
            // Is this required for FireFox? Would be good to do this without magic strings.
            // Won't it overwrite the previous setting
            Response.Headers.Add("Cache-Control", "no-cache, no-store");
    
            // Why is it necessary to explicitly call SetExpires. Presume it is still better than calling
            // Response.Headers.Add( directly
            Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1));
        }
    }
    
  • Michael Kniskern
    Michael Kniskern almost 13 years
    The HttpContext.Current.Response.Cache.SetAllowResponseInBrowser‌​History(false) made the difference to prevent caching in bith IE and FireFox
  • daniloquio
    daniloquio about 12 years
    +1 This is working for me in Chrome, thanks a lot. I also use Response.Cache.SetAllowResponseInBrowserHistory(true); to avoid history to store an entry for each request of the same page.
  • md1337
    md1337 about 12 years
    Not sure what this is supposed to do, but it does look like a big fat hack that is bound to fail in the next update of any of these browsers.
  • md1337
    md1337 about 12 years
    Apparently someone has discovered that using SetCacheability with NoCache also disables the ASP.NET output cache (server-side cache). They suggest to use the ServerAndNoCache option instead. codeclimber.net.nz/archive/2007/04/01/…
  • Edward Brey
    Edward Brey about 11 years
    To clarify the comments in the code snippet, the main method is SetCacheability. SetNoStore is an IE6 workaround. See Why both no-cache and no-store should be used in HTTP response?.
  • felickz
    felickz almost 11 years
    FWIW ... Needed to add SetNoStore for IE10
  • Evan Haas
    Evan Haas almost 11 years
    -1, setting in these Application_BeginRequest() causes the no-cache headers to be sent for items that you'll probably want cached (JavaScript files, images, etc). I haven't tried it yet, but the OP's location (setting the headers in the ASP page itself) is probably better.
  • Laurence
    Laurence almost 11 years
    I did expect this answer to work as it is neatest way to set it in glabal.asax but no joy yet
  • Adam Carr
    Adam Carr over 10 years
    @Evan, Application_BeginRequest will only be called for requests that are sent from IIS to ASP.NET. Many times, static files like CSS, JS, Images, Fonts, etc. are extensions that are considered static files from IIS and not sent to the ASP.NET Runtime. If IIS is set up to send all requests to the ASP.NET runtime, then yes, this would apply to all requests, even if the files are static and should be cached.
  • Evan Haas
    Evan Haas over 10 years
    @Adam, makes sense. I would undo my -1 but SO says my vote is locked in :-(
  • dana
    dana about 10 years
    OK, nit pick here... The HttpResponse object is being referenced 2 different ways: 1) HttpContext.Current.Response and 2) Response. It would probably be cleaner to pick one or the other.
  • StriplingWarrior
    StriplingWarrior almost 10 years
    I've found applying a global action filter to be more modular. Plus you can accommodate situations where MVC is serving up static files (like Bundled scripts and styles). stackoverflow.com/a/23682242/120955
  • jahu
    jahu almost 10 years
    StriplingWarrior is right, this method also appears to affect bundles (which is not what most people would want). In local environment it will also affect static files like Evan Haas said, but on remote server, IIS will handle those (unless you set it differently for some reason). I've patched up a quick and dirty solution to this problem here stackoverflow.com/a/23695387/2123652
  • Paddy
    Paddy over 9 years
    For those reading this page who will be outputting dynamic PDFs over https and setting the cache headers like this, please beware the following IE8 and lower bug: stackoverflow.com/questions/1038707/…
  • ChrisW
    ChrisW over 7 years
    It's explained at e.g. web.archive.org/web/20160112095216/http://www.hunlock.com/bl‌​ogs/… -- in summary the onbeforeunload event was implemented to be used by banks and prevents the page being cached.
  • Alexander
    Alexander over 3 years
    This is the absolute right question on this topic! I have tried everything, action fiters onExecuting and onExecuted with all kind of combinations and nothing workes. But adding this on my rendering model worked like a charm!