Question

Pour mon blog, je souhaite utiliser le cache de sortie pour enregistrer une version en cache d'un article particulier pendant environ 10 minutes, et c'est très bien...

<%@OutputCache Duration="600" VaryByParam="*" %>

Cependant, si quelqu'un publie un commentaire, je souhaite vider le cache afin que la page soit actualisée et que le commentaire puisse être vu.

Comment faire cela dans ASP.Net C# ?

Était-ce utile?

La solution

J'ai trouvé la réponse que je cherchais :

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");

Autres conseils

Les solutions ci-dessus conviennent si vous savez pour quelles pages vous souhaitez vider le cache.Dans mon exemple (ASP.NET MVC), j'ai référencé les mêmes données de partout.Par conséquent, lorsque j'ai effectué une [sauvegarde], je voulais vider le cache à l'échelle du site.C'est ce qui a fonctionné pour moi: http://aspalliance.com/668

Cela se fait dans le contexte d'un filtre OnActionExecuting.Cela pourrait tout aussi bien être fait en remplaçant OnActionExecuting dans un BaseController ou quelque chose du genre.

HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");

Installation:

protected void Application_Start()
{
    HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}

Ajustement mineur :J'ai un assistant qui ajoute des "messages flash" (messages d'erreur, messages de réussite - "Cet élément a été enregistré avec succès", etc.).Afin d'éviter que le message flash n'apparaisse à chaque GET ultérieur, j'ai dû l'invalider après avoir écrit le message flash.

Vider le cache :

HttpRuntime.Cache.Insert("Pages", DateTime.Now);

J'espère que cela t'aides.

Utilisation de Response.AddCacheItemDependency pour effacer tous les caches de sortie.

  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);
    }

Ceci peut également être utilisé dans OutputCachedPage d'ASP.NET MVC.

Lors de l'événement de chargement de la page maître, veuillez écrire ce qui suit :

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

et dans le bouton de déconnexion, cliquez sur :

Session.Abandon();
Session.Clear();

Hmm.Vous pouvez spécifier un attribut VaryByCustom sur l'élément OutputCache.La valeur de this est transmise en tant que paramètre à la méthode GetVaryByCustomString que vous pouvez implémenter dans global.asax.La valeur renvoyée par cette méthode est utilisée comme index dans les éléments mis en cache - si vous renvoyez le nombre de commentaires sur la page, par exemple, chaque fois qu'un commentaire est ajouté, une nouvelle page sera mise en cache.

La mise en garde est que cela ne vide pas réellement le cache.Si une entrée de blog est fortement utilisée par les commentaires, la taille de votre cache pourrait exploser avec cette méthode.

Alternativement, vous pouvez implémenter les éléments non modifiables de la page (la navigation, les publicités, l'entrée de blog réelle) en tant que contrôles utilisateur et implémenter une mise en cache partielle des pages sur chacun de ces contrôles utilisateur.

Si vous remplacez "*" uniquement par les paramètres sur lesquels le cache doit varier (PostID ?), vous pouvez faire quelque chose comme ceci :

//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);

et quand quelqu'un ajoute un commentaire...

Cache.Remove(key);

Je suppose que cela fonctionnerait même avec VaryByParam *, puisque toutes les requêtes seraient liées à la même dépendance de cache.

pourquoi ne pas utiliser la dépendance sqlcached sur la table posts ?

dépendance sqlcached msdn

De cette façon, vous n'implémentez pas de code de suppression de cache personnalisé et actualisez simplement le cache à mesure que le contenu change dans la base de données ?

HttpRuntime.Close() ..J'essaie toutes les méthodes et c'est la seule qui fonctionne pour moi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top