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#?

Foi útil?

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?

msdnsqlcachedependency

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top