it-swarm-pt.tech

Desativando o cache do navegador para todos os navegadores do ASP.NET

Eu estou depois de uma referência definitiva para o código ASP.NET é necessário para navegadores desabilitados de cache da página. Há muitas maneiras de afetar os cabeçalhos HTTP e as meta tags e tenho a impressão de que configurações diferentes são necessárias para que diferentes navegadores se comportem corretamente. Seria muito bom obter um bit de código de referência comentado para indicar o que funciona para todos os navegadores e que é necessário para determinado navegador, incluindo versões.

Existe uma enorme 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 determinada técnica 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 versões anteriores também.

Esta entrada de blog Duas Diferenças Importantes entre o Firefox eo IE Cache 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));
    }
}
81
Martin Hollingsworth

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 pára o armazenamento em cache no Firefox e no IE, mas ainda não experimentamos outros navegadores. Os seguintes cabeçalhos de resposta são incluídos por estas instruções:

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

Por que vale a pena, eu só tinha que lidar com isso no 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);
    }
38
Adam Carr

Eu tentei várias combinações e eles falharam no FireFox. Já faz um tempo, então a resposta acima pode funcionar bem ou eu posso ter perdido alguma coisa.

O que sempre funcionou para mim é adicionar o seguinte ao cabeçalho de cada página ou ao modelo (Página Mestra em .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 desativou todo o cache em todos os navegadores para mim sem falhar.

2
Steve

Existem duas abordagens que eu conheço. A primeira é dizer ao navegador para não armazenar em cache a página. Definir a resposta para nenhum cache cuida disso, no entanto, como você suspeitar que o navegador irá ignorar essa diretiva. A outra abordagem é definir o tempo de data de sua resposta para um ponto no futuro. Eu acredito que todos os navegadores irão corrigir isso para a hora atual quando eles adicionarem a página ao cache, mas mostrará a página como mais nova quando a comparação for feita. Eu 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 nova versão do navegador. Nota final Tive melhor sorte com páginas que "atualizam" a si mesmas (outra diretiva de resposta). A atualização parece menos provável de vir do cache. 

Espero que ajude.

1
Pat O

Veja também Como evitar que o google chrome armazene em cache minhas entradas, especialmente as ocultas quando o usuário clicar de volta? sem o qual o Chrome pode recarregar, mas preservar o conteúdo anterior dos elementos <input> - em outras palavras, use autocomplete="off".

0
ChrisW

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 armazena em cache as páginas). Também achei este artigo muito útil em documentação sobre como e por que o armazenamento em cache funciona e olhará para o próximo do ETag se o no-store não for confiável:

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

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

0
The Coder