ASP.NET'ten tüm tarayıcılar için tarayıcı önbelleğini devre dışı bırakma


87

Devre dışı tarayıcıların sayfayı önbelleğe alması için hangi ASP.NET kodunun gerekli olduğuna dair kesin bir başvurunun peşindeyim. HTTP üstbilgilerini ve meta etiketleri etkilemenin birçok yolu vardır ve farklı tarayıcıların doğru şekilde davranması için farklı ayarların gerekli olduğu izlenimini edindim. Hangisinin tüm tarayıcılarda işe yaradığını ve sürümler dahil belirli tarayıcılar için hangisinin gerekli olduğunu belirtmek için yorumlanmış bir referans kod parçası almak gerçekten harika olurdu.

Orada bu konu hakkında çok fazla bilgi var, ancak henüz her yöntemin faydalarını ve belirli bir tekniğin daha yüksek seviyeli bir API tarafından değiştirilip değiştirilmediğini açıklayan iyi bir referans bulamadım.

Özellikle ASP.NET 3.5 SP1 ile ilgileniyorum, ancak önceki sürüm için de yanıt almak iyi olur.

Bu blog girişi Firefox ve IE Önbelleğe Alma Arasındaki İki Önemli Fark , bazı HTTP protokol davranış farklılıklarını açıklar.

Aşağıdaki örnek kod, ilgilendiğim şeyi göstermektedir

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));
    }
}

5
Görevinin ne kadar imkansız olduğunu bilmeseydim cevap vermeye çalışırdım. Müşterinin önbelleğini kontrol etmek, mobilyaları yeniden düzenlemek için 10 fit uzunluğundaki çubuklar kullanmaya benzer.
Jeff Meatball Yang

Sorunun sadece bir kısmını kapsayan pek çok cevap yine de çok değerli olacaktır. Lütfen 2 sent değerinizi atın.
Martin Hollingsworth

Yanıtlar:


98

ASP.NET'te kullandığımız şey budur:

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

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

Firefox ve IE'de önbelleğe almayı durdurur, ancak diğer tarayıcıları denemedik. Aşağıdaki yanıt başlıkları bu ifadeler tarafından eklenir:

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

5
+1 Bu, Chrome'da benim için çalışıyor, çok teşekkürler. Ayrıca Response.Cache.SetAllowResponseInBrowserHistory (true) kullanıyorum; geçmişi önlemek için aynı sayfadaki her istek için bir giriş saklamak.
daniloquio

12
Görünüşe göre birisi NoCache ile SetCacheability kullanmanın ASP.NET çıktı önbelleğini (sunucu tarafı önbelleği) devre dışı bıraktığını keşfetti. Bunun yerine ServerAndNoCache seçeneğini kullanmanızı önerirler. codeclimber.net.nz/archive/2007/04/01/…
md1337

1
Kod parçacığındaki yorumları netleştirmek için ana yöntem SetCacheability. SetNoStorebir IE6 geçici çözümüdür. Bkz no-cache ve hiçbir mağaza hem HTTP yanıtı kullanılmalıdır Neden? .
Edward Brey

3
FWIW ... IE10 için SetNoStore eklemek gerekiyor
felickz

Dinamik PDF'leri https üzerinden çıkaracak ve önbellek başlıklarını bu şekilde ayarlayacak bu sayfayı okuyanlar için, lütfen aşağıdaki IE8 ve daha düşük hataya dikkat edin: stackoverflow.com/questions/1038707/…
Paddy

41

Değeri ne olursa olsun, bunu ASP.NET MVC 3 uygulamamda halletmem gerekiyordu. Global.asax dosyasında tüm istekler için bunu işlemek için kullandığım kod bloğu.

    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);
    }

Bu HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false), IE ve
FireFox'ta

2
-1, bu Application_BeginRequest () öğesinin ayarlanması, muhtemelen önbelleğe alınmasını isteyeceğiniz öğeler (JavaScript dosyaları, resimler, vb.) İçin önbelleksiz başlıkların gönderilmesine neden olur. Henüz denemedim, ancak OP'nin konumu (başlıkları ASP sayfasının kendisinde belirleme) muhtemelen daha iyi.
Evan Haas

Bu cevabın işe yaramasını bekliyordum, çünkü onu glabal.asax'a yerleştirmenin en düzgün yolu ama henüz sevinç yok
lawphotog

5
@Evan, Application_BeginRequest yalnızca IIS'den ASP.NET'e gönderilen istekler için çağrılacaktır. Çoğu zaman, CSS, JS, Görüntüler, Yazı Tipleri vb. Gibi statik dosyalar, IIS'den gelen statik dosyalar olarak kabul edilen ve ASP.NET Çalışma Zamanına gönderilmeyen uzantılardır. IIS, tüm istekleri ASP.NET çalışma zamanına gönderecek şekilde ayarlanmışsa, evet, bu, dosyalar statik olsa ve önbelleğe alınması gerekse bile tüm istekler için geçerli olur.
Adam Carr

@Adam, mantıklı. -1'imi geri alırdım ama SO, oyumun kilitlendiğini söylüyor :-(
Evan Haas

2

Çeşitli kombinasyonları denedim ve FireFox'ta başarısız olmalarını sağladım. Uzun zaman oldu, bu yüzden yukarıdaki cevap işe yarayabilir veya bir şeyi kaçırmış olabilirim.

Benim için her zaman işe yarayan şey, aşağıdakileri her sayfanın başına veya şablona (.net içinde Ana Sayfa) eklemektir.

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

Bu, benim için tüm tarayıcılarda tüm önbelleğe almayı başarısız olmadan devre dışı bıraktı.


7
Bunun ne yapması gerektiğinden emin değilim, ancak bu tarayıcılardan herhangi birinin bir sonraki güncellemesinde başarısız olması gereken büyük bir hack gibi görünüyor.
md1337

Örneğin web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… adresinde açıklanmıştır - özet olarak onbeforeunload olayı bankalar tarafından kullanılmak üzere uygulanmıştır ve sayfanın önbelleğe alınmasını önler.
ChrisW

1

Bildiğim iki yaklaşım var. Birincisi, tarayıcıya sayfayı önbelleğe almamasını söylemektir. Yanıtı hiçbir önbellek olarak ayarlamak bununla ilgilenmez, ancak şüphelendiğiniz gibi tarayıcının genellikle bu yönergeyi göz ardı edeceğinden şüphelenirsiniz. Diğer yaklaşım, yanıtınızın tarih saatini gelecekteki bir noktaya ayarlamaktır. Tüm tarayıcıların sayfayı önbelleğe eklediklerinde bunu geçerli saate göre düzelteceğine inanıyorum, ancak karşılaştırma yapıldığında sayfayı daha yeni gösterecek. Bir karşılaştırma yapılmayan bazı durumlar olabileceğine inanıyorum. Ayrıntılardan emin değilim ve her yeni tarayıcı sürümünde değişiyorlar. Son not Kendilerini "yenileyen" sayfalarda daha şanslıydım (başka bir yanıt yönergesi). Yenilemenin önbellekten gelmesi daha az olası görünüyor.

Umarım yardımcı olur.


0

Bunun tarayıcı önbelleğe alma işleminde bir fark yaratıp yaratmadığını görmek için mağazamıza olmayan etiketi sitemize eklemeyi test edeceğim (Chrome bazen sayfaları önbelleğe alıyor). Ayrıca bu makaleyi, önbelleğe alma işleminin nasıl ve neden çalıştığına dair dokümantasyon konusunda çok yararlı buldum ve mağazasız güvenilir değilse ETag'a bir sonraki bakacağım:

http://www.mnot.net/cache_docs/

http://en.wikipedia.org/wiki/HTTP_ETag


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.