Eu tenho um aplicativo ASP.NET MVC 3. Este aplicativo solicita registros através do jQuery. O jQuery chama de volta para uma ação do controlador que retorna resultados no formato JSON. Não pude provar isso, mas estou preocupado que meus dados estejam ficando em cache.
Quero apenas que o cache seja aplicado a ações específicas, não a todas as ações.
Existe um atributo que eu possa colocar em uma ação para garantir que os dados não sejam armazenados em cache? Caso contrário, como posso garantir que o navegador obtenha um novo conjunto de registros a cada vez, em vez de um conjunto em cache?
c#
jquery
.net
asp.net-mvc
asp.net-mvc-3
Desenvolvedor JavaScript
fonte
fonte
Respostas:
Para garantir que o JQuery não esteja armazenando em cache os resultados, em seus métodos ajax, coloque o seguinte:
Ou para impedir o armazenamento em cache no MVC, criamos nosso próprio atributo, você pode fazer o mesmo. Aqui está o nosso código:
Em seguida, basta decorar seu controlador com
[NoCache]
. OU para fazer isso por tudo, você pode simplesmente colocar o atributo na classe da classe base da qual você herda seus controladores (se você tiver um) como nós temos aqui:Você também pode decorar algumas das ações com esse atributo se precisar que elas não sejam armazenáveis em cache, em vez de decorar todo o controlador.
Se a sua classe ou ação não teve
NoCache
quando foi renderizada no seu navegador e você deseja verificar se está funcionando, lembre-se de que, após compilar as alterações, é necessário fazer uma "atualização definitiva" (Ctrl + F5) no seu navegador. Até você fazer isso, seu navegador manterá a versão antiga em cache e não a atualizará com uma "atualização normal" (F5).fonte
Você pode usar o atributo de cache interno para impedir o armazenamento em cache.
Para o .net Framework:
[OutputCache(NoStore = true, Duration = 0)]
Para .net Core:
[ResponseCache(NoStore = true, Duration = 0)]
Esteja ciente de que é impossível forçar o navegador a desativar o cache. O melhor que você pode fazer é fornecer sugestões que a maioria dos navegadores respeitará, geralmente na forma de cabeçalhos ou metatags. Este atributo decorador irá desativar o cache do servidor e também adicionar este cabeçalho:
Cache-Control: public, no-store, max-age=0
. Não adiciona meta tags. Se desejado, esses podem ser adicionados manualmente na exibição.Além disso, o JQuery e outras estruturas de clientes tentarão induzir o navegador a não usar sua versão em cache de um recurso adicionando itens ao URL, como um carimbo de data / hora ou GUID. Isso é eficaz para fazer o navegador solicitar o recurso novamente, mas na verdade não impede o armazenamento em cache.
Em uma nota final. Você deve estar ciente de que os recursos também podem ser armazenados em cache entre o servidor e o cliente. Os ISP, proxies e outros dispositivos de rede também armazenam em cache recursos e geralmente usam regras internas sem examinar o recurso real. Não há muito que você possa fazer sobre isso. A boa notícia é que eles geralmente armazenam em cache por períodos mais curtos, como segundos ou minutos.
fonte
Cache-Control:public, no-store, max-age=0
. Não adiciona meta tags. Se desejado, esses podem ser adicionados manualmente na exibição.NoStore = true
eDuration = 0
(que eu usei com sucesso, obrigado), mas que efeito adicional teriaVaryByParam = "None"
como as outras duas opções afetam todas as solicitações, independentemente do parâmetro?Tudo o que você precisa é:
ou, se você deseja desativá-lo para um controlador inteiro:
Apesar do debate nos comentários aqui, isso é suficiente para desativar o cache do navegador - isso faz com que o ASP.Net emita cabeçalhos de resposta que informam ao navegador que o documento expira imediatamente:
fonte
Cache-Control
parapublic
max-age=0
nunca significou 'cache desativado'. Isso significa apenas que o conteúdo da resposta deve ser considerado imediatamente obsoleto , mas é permitido que um cache o armazene em cache. Os navegadores devem validar a atualização do conteúdo antigo armazenado em cache antes de usá-lo, mas não é obrigatório, a menos que a diretiva adicionalmust-revalidate
seja especificada.Na ação do controlador, adicione ao cabeçalho as seguintes linhas
fonte
Aqui está o
NoCache
atributo proposto por mattytommo, simplificado usando as informações da resposta de Chris Moschini:fonte
max-age=0
nunca significou 'cache desativado'. Isso significa apenas que o conteúdo da resposta deve ser considerado imediatamente obsoleto , mas é permitido que um cache o armazene em cache. Os navegadores devem validar a atualização do conteúdo antigo armazenado em cache antes de usá-lo, mas não é obrigatório, a menos que a diretiva adicionalmust-revalidate
seja especificada.no-cache
, que ainda permite o armazenamento em cache, mas exige a revalidação no servidor de origem antes de qualquer uso. Para evitar o armazenamento em cache revalidado, é necessário adicionarno-store
juntono-cache
. (no-store
Sozinho é errado simplesmente porque caches voláteis estão autorizados a cache de conteúdo marcado comono-store
.)Para MVC6 ( DNX ), não há
System.Web.OutputCacheAttribute
Nota: quando você define o
NoStore
parâmetro Duration, não é considerado. É possível definir uma duração inicial para o primeiro registro e substituí-la por atributos personalizados.Mas nos temos
Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
É possível substituir o filtro inicial por um atributo personalizado
Aqui está um caso de uso
fonte
Cache de saída no MVC
fonte
O valor correto do atributo para o Asp.Net MVC Core para impedir o cache do navegador (incluindo o Internet Explorer 11 ) é:
conforme descrito na documentação da Microsoft:
Cache de resposta no ASP.NET Core - NoStore e Location.None
fonte
Soluções ASP.NET MVC 5:
App_Start/FilterConfig.cs
'sRegisterGlobalFilters
método:OutputCache
diretivaController
ouView
nível diferente. Para o controlador regular, éou se é
ApiController
que seriafonte