Jestem za ostatecznym odniesieniem do tego, jaki kod ASP.NET jest wymagany, aby wyłączyć buforowanie strony przez przeglądarki. Istnieje wiele sposobów wpływania na nagłówki HTTP i metatagi i wydaje mi się, że różne ustawienia są wymagane, aby różne przeglądarki działały poprawnie. Byłoby naprawdę wspaniale, gdybyśmy skomentowali fragment kodu odniesienia, aby wskazać, który działa dla wszystkich przeglądarek, a który jest wymagany dla określonej przeglądarki, w tym wersji.
Jest tam mnóstwo informacji na temat tego problemu, ale nie znalazłem jeszcze dobrego odniesienia opisującego zalety każdej metody i czy dana technika została zastąpiona przez API wyższego poziomu.
Szczególnie interesuje mnie ASP.NET 3.5 SP1, ale dobrze byłoby uzyskać odpowiedzi również na wcześniejszą wersję.
W tym wpisie na blogu Dwie ważne różnice między przeglądarką Firefox a buforowaniem przeglądarki IE opisano niektóre różnice w zachowaniu protokołu HTTP.
Poniższy przykładowy kod ilustruje rodzaj rzeczy, które mnie interesują
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));
}
}
Odpowiedzi:
Oto, czego używamy w ASP.NET:
// Stop Caching in IE Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); // Stop Caching in Firefox Response.Cache.SetNoStore();
Przestaje buforować w przeglądarce Firefox i IE, ale nie próbowaliśmy innych przeglądarek. Następujące nagłówki odpowiedzi są dodawane przez te instrukcje:
Cache-Control: no-cache, no-store Pragma: no-cache
źródło
SetCacheability
.SetNoStore
to obejście IE6. Zobacz Dlaczego w odpowiedzi HTTP należy używać zarówno opcji no-cache, jak i no-store? .Po prostu musiałem sobie z tym poradzić w mojej aplikacji ASP.NET MVC 3. Oto blok kodu, którego użyłem w pliku Global.asax do obsługi tego dla wszystkich żądań.
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); }
źródło
HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)
Robiło różnicę, aby zapobiec buforowania w bith IE i FirefoxWypróbowałem różne kombinacje i zawiodły w FireFox. Minęło trochę czasu, więc powyższa odpowiedź może działać dobrze lub mogłem coś przeoczyć.
Zawsze działało dla mnie dodanie następującego tekstu do nagłówka każdej strony lub szablonu (Strona główna w .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>
To bez wątpienia wyłączyło buforowanie we wszystkich przeglądarkach.
źródło
Znam dwa podejścia. Pierwszym jest poinformowanie przeglądarki, aby nie buforowała strony. Ustawienie odpowiedzi na brak pamięci podręcznej załatwia to, jednak jak podejrzewasz, przeglądarka często ignoruje tę dyrektywę. Innym podejściem jest ustawienie daty i godziny Twojej odpowiedzi na moment w przyszłości. Wierzę, że wszystkie przeglądarki poprawią to do aktualnego czasu, kiedy dodadzą stronę do pamięci podręcznej, ale pokaże stronę jako nowszą po dokonaniu porównania. Uważam, że mogą istnieć przypadki, w których nie dokonuje się porównania. Nie jestem pewien szczegółów i zmieniają się z każdą nową wersją przeglądarki. Uwaga końcowa Miałem więcej szczęścia ze stronami, które same się „odświeżają” (kolejna dyrektywa odpowiedzi). Wydaje się, że odświeżanie z pamięci podręcznej jest mniej prawdopodobne.
Mam nadzieję, że to pomoże.
źródło
Mam zamiar przetestować dodanie tagu no-store do naszej witryny, aby sprawdzić, czy ma to wpływ na buforowanie przeglądarki (Chrome czasami buforował strony). Uważam również, że ten artykuł jest bardzo przydatny w dokumentacji dotyczącej tego, jak i dlaczego działa buforowanie i przyjrzę się następnym ETag, jeśli brak sklepu nie jest wiarygodny:
http://www.mnot.net/cache_docs/
http://en.wikipedia.org/wiki/HTTP_ETag
źródło
Zobacz także Jak uniemożliwić Google Chrome buforowanie moich danych wejściowych, szczególnie ukrytych, gdy użytkownik kliknie wstecz? bez którego Chrome mógłby przeładować, ale zachować poprzednią zawartość
<input>
elementów - innymi słowy, użyjautocomplete="off"
.źródło