Estou atrás de uma referência definitiva a qual código ASP.NET é necessário para que os navegadores desabilitem o cache da página. Existem muitas maneiras de afetar os cabeçalhos HTTP e metatags e tenho a impressão de que diferentes configurações são necessárias para fazer com que navegadores diferentes se comportem corretamente. Seria muito bom ter um pedaço de código de referência comentado para indicar o que funciona para todos os navegadores e o que é necessário para um navegador específico, incluindo versões.
Há uma grande quantidade de informações sobre esse problema, mas ainda não encontrei uma boa referência que descreva os benefícios de cada método e se uma técnica específica foi substituída por uma API de nível superior.
Estou particularmente interessado no ASP.NET 3.5 SP1, mas seria bom obter respostas para a versão anterior também.
Esta entrada do blog Duas diferenças importantes entre o cache do Firefox e do IE descreve algumas diferenças de comportamento do protocolo HTTP.
O código de exemplo a seguir ilustra o tipo de coisa em que estou interessado
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));
}
}
Respostas:
Isso é o que usamos no ASP.NET:
// Stop Caching in IE Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); // Stop Caching in Firefox Response.Cache.SetNoStore();
Ele para de armazenar em cache no Firefox e no IE, mas não experimentamos outros navegadores. Os seguintes cabeçalhos de resposta são adicionados por estas instruções:
Cache-Control: no-cache, no-store Pragma: no-cache
fonte
SetCacheability
.SetNoStore
é uma solução alternativa para o IE6. Consulte Por que no-cache e no-store devem ser usados na resposta HTTP? .Para valer a pena, eu apenas tive que lidar com isso em meu aplicativo ASP.NET MVC 3. Aqui está o bloco de código que usei no arquivo Global.asax para lidar com isso para todas as solicitações.
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); }
fonte
HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)
fez a diferença para evitar o cache no IE e FireFoxEu tentei várias combinações e eles falharam no FireFox. Já faz um tempo que a resposta acima pode funcionar bem ou posso ter esquecido alguma coisa.
O que sempre funcionou para mim é adicionar o seguinte ao cabeçalho de cada página, ou o modelo (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>
Isso desabilitou todo o cache em todos os navegadores para mim sem falhar.
fonte
Existem duas abordagens que conheço. A primeira é dizer ao navegador para não armazenar a página em cache. Definir a resposta para nenhum cache cuida disso, no entanto, como você suspeita, o navegador frequentemente ignorará essa diretiva. A outra abordagem é definir a data e hora de sua resposta para um ponto no futuro. Acredito que todos os navegadores irão corrigir isso para a hora atual quando adicionarem a página ao cache, mas irá mostrar a página como mais recente quando a comparação for feita. Acredito que pode haver alguns casos em que uma comparação não é feita. Não tenho certeza dos detalhes e eles mudam a cada novo lançamento do navegador. Nota final Tive mais sorte com páginas que se "atualizam" (outra diretiva de resposta). A atualização parece menos provável de vir do cache.
Espero que ajude.
fonte
Vou testar a adição da tag no-store ao nosso site para ver se isso faz diferença no cache do navegador (o Chrome às vezes tem feito o cache das páginas). Eu também achei este artigo muito útil na documentação sobre como e por que o armazenamento em cache funciona e irei dar uma olhada nas ETags a seguir se o no-store não for confiável:
http://www.mnot.net/cache_docs/
http://en.wikipedia.org/wiki/HTTP_ETag
fonte
Veja também Como evitar que o Google Chrome armazene em cache minhas entradas, especialmente as ocultas quando o usuário clicar novamente sem o qual o Chrome pode recarregar, mas preservar o conteúdo anterior dos
<input>
elementos - em outras palavras, useautocomplete="off"
.fonte