Limpando o cache da página no ASP.NET
-
08-06-2019 - |
Pergunta
Para o meu blog, quero usar o cache de saída para salvar uma versão em cache de uma postagem específica por cerca de 10 minutos, e tudo bem...
<%@OutputCache Duration="600" VaryByParam="*" %>
No entanto, se alguém postar um comentário, quero limpar o cache para que a página seja atualizada e o comentário possa ser visto.
Como faço isso em ASP.Net C#?
Solução
Encontrei a resposta que procurava:
HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
Outras dicas
Os itens acima são adequados se você souber para quais páginas deseja limpar o cache.Na minha instância (ASP.NET MVC), referenciei os mesmos dados de todo o lado.Portanto, quando fiz um [save], queria limpar o cache de todo o site.Isto é o que funcionou para mim: http://aspalliance.com/668
Isso é feito no contexto de um filtro OnActionExecuting.Isso poderia ser feito facilmente substituindo OnActionExecuting em um BaseController ou algo assim.
HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");
Configurar:
protected void Application_Start()
{
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}
Pequeno ajuste:Eu tenho um auxiliar que adiciona "mensagens flash" (mensagens de erro, mensagens de sucesso - "Este item foi salvo com sucesso", etc).Para evitar que a mensagem flash aparecesse em todos os GET subsequentes, tive que invalidar depois de escrever a mensagem flash.
Limpando Cache:
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
Espero que isto ajude.
Usando Response.AddCacheItemDependency para limpar todos os caches de saída.
public class Page : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
try
{
string cacheKey = "cacheKey";
object cache = HttpContext.Current.Cache[cacheKey];
if (cache == null)
{
HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
}
Response.AddCacheItemDependency(cacheKey);
}
catch (Exception ex)
{
throw new SystemException(ex.Message);
}
base.OnLoad(e);
}
}
// Clear All OutPutCache Method
public void ClearAllOutPutCache()
{
string cacheKey = "cacheKey";
HttpContext.Cache.Remove(cacheKey);
}
Isso também pode ser usado no OutputCachedPage do ASP.NET MVC.
No evento de carregamento da página mestra, escreva o seguinte:
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
e no botão de logout clique em:
Session.Abandon();
Session.Clear();
Hum.Você pode especificar um atributo VaryByCustom no item OutputCache.O valor disso é passado como parâmetro para o método GetVaryByCustomString que você pode implementar em global.asax.O valor retornado por este método é usado como um índice para os itens armazenados em cache - se você retornar o número de comentários na página, por exemplo, cada vez que um comentário for adicionado, uma nova página será armazenada em cache.
A ressalva é que isso não limpa realmente o cache.Se uma entrada de blog receber muitos comentários, seu cache poderá explodir com esse método.
Como alternativa, você pode implementar os bits não alteráveis da página (a navegação, os anúncios, a entrada real do blog) como controles de usuário e implementar o cache parcial da página em cada um desses controles de usuário.
Se você alterar "*" apenas para os parâmetros em que o cache deve variar (PostID?), poderá fazer algo assim:
//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);
e quando alguém adiciona um comentário...
Cache.Remove(key);
Acho que isso funcionaria mesmo com VaryByParam *, já que todas as solicitações estariam vinculadas à mesma dependência de cache.
por que não usar o sqlcachedependency na tabela de posts?
Dessa forma, você não está implementando um código de limpeza de cache personalizado e simplesmente atualizando o cache conforme o conteúdo muda no banco de dados?
HttpRuntime.Close()
..Eu tento todos os métodos e este é o único que funciona para mim