web-dev-qa-db-fra.com

Comment vider le cache du serveur dans asp.net?

Comment vider le cache du serveur dans asp.net? J'ai découvert qu'il existe deux types de cache. Il y a le cache du navigateur et le cache du serveur. J'ai effectué des recherches mais je n'ai pas encore trouvé de guide clair et détaillé pour vider le cache du serveur à l'aide de asp.net (ou non).

(mise à jour) Je viens d'apprendre que le code-behind correspondant est dans VB - Visual Basic (dot net). 

30
xarzu

Vous pouvez parcourir tous les éléments du cache et les supprimer un par un:

foreach (System.Collections.DictionaryEntry entry in HttpContext.Current.Cache){
    HttpContext.Current.Cache.Remove(string(entry.Key));
}

Correction de la syntaxe pour ASP.NET 4.5 C #

foreach (System.Collections.DictionaryEntry entry in HttpContext.Current.Cache){
    HttpContext.Current.Cache.Remove((string)entry.Key);
}
44
Kenneth

Il y a un problème avec l'itération: ce n'est pas thread-safe. Si vous effectuez une itération et que le cache est accessible à partir d'un autre thread, vous risquez de recevoir une erreur . La probabilité que cela se produise est faible, mais c'est un problème pour les applications à charge élevée. les implémentations ne fournissent même pas de méthodes d'itération.

En outre, si vous effacez vos éléments de cache, vous ne voulez pas tout effacer de chaque partie du domaine de l'application, mais uniquement de ce qui vous concerne.

Lorsque j'ai rencontré ce problème, je l'ai résolu en ajoutant une CacheDependency personnalisée à toutes mes entrées de cache.

Voici comment la CacheDependency est définie: 

public class CustomCacheDependency : CacheDependency
{
    //this method is called to expire a cache entry:
    public void ForceDependencyChange()
    {
        this.NotifyDependencyChanged(this, EventArgs.Empty);
    }
}

//this is how I add objects to cache:
HttpContext.Current.Cache.Add(key, //unique key 
            obj, 
            CreateNewDependency(), //the factory method to allocate a dependency
            System.Web.Caching.Cache.NoAbsoluteExpiration,
            new TimeSpan(0, 0, ExpirationInSeconds),
            System.Web.Caching.CacheItemPriority.Default,
            ReportRemovedCallback);

//A list that holds all the CustomCacheDependency objects:
#region dependency mgmt
private List<CustomCacheDependency> dep_list = new List<CustomCacheDependency>();

private CustomCacheDependency CreateNewDependency()
{
        CustomCacheDependency dep = new CustomCacheDependency();
        lock (dep_list)
        {
            dep_list.Add(dep);
        }
        return dep;
}

//this method is called to flush ONLY my cache entries in a thread safe fashion:
private void FlushCache()
{
        lock (dep_list)
        {
            foreach (CustomCacheDependency dep in dep_list) dep.ForceDependencyChange();
            dep_list.Clear();
        }
} 
#endregion
8
J W

Je ne suis pas sûr de la méthodologie exacte dans laquelle vous voudriez accomplir ceci. Mais il y a plusieurs façons, l'une est celle que Giorgio Minardi a postée et qui provient de cette question .

Les autres choix pourraient être comme ceci:

using Microsoft.Web.Administration;

public bool RecycleApplicationPool(string appPoolName)
{

    try
    {
        using (ServerManager iisManager = new ServerManager())
        {
             iisManager.ApplicationPools[appPoolName].Recycle();
             return true;
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Unhandled Exception");
    }
}

Cela permettra de recycler votre pool d'applications. Ce qui effacerait le cache. Vous avez quelques choix. Attention, bien que cela videra le cache, cela mettra également fin à toutes les sessions existantes.

Espérons que cela aide.

2
Greg
public void ClearCacheItems()
{
   List<string> keys = new List<string>();
   IDictionaryEnumerator enumerator = Cache.GetEnumerator();

   while (enumerator.MoveNext())
     keys.Add(enumerator.Key.ToString());

   for (int i = 0; i < keys.Count; i++)
      Cache.Remove(keys[i]);
} 
2
Faisal Pathan

System.Web.HttpRuntime.UnloadAppDomain () - redémarre l'application Web, efface le cache, réinitialise les ensembles css/js

1
Pavel Nazarov

Vous devrez supprimer les éléments que vous avez ajoutés à la mémoire cache: 

var itemsInCache= HttpContext.Current.Cache.GetEnumerator();

while (itemsInCache.MoveNext())
{

    HttpContext.Current.Cache.Remove(enumerator.Key);

}
1
Giorgio Minardi

ajoutez ce code à l'événement de chargement de page ..il s'agit d'en-têtes http pour vider le cache.

Response.CacheControl = "private"
Response.CacheControl = "no-cache"
Response.ClearHeaders()
Response.AppendHeader("Cache-Control", "no-cache")        
Response.AppendHeader("Cache-Control", "private")            
Response.AppendHeader("Cache-Control", "no-store")          
Response.AppendHeader("Cache-Control", "must-revalidate")          
Response.AppendHeader("Cache-Control", "max-stale=0")           
Response.AppendHeader("Cache-Control", "post-check=0")           
Response.AppendHeader("Cache-Control", "pre-check=0")      
Response.AppendHeader("Pragma", "no-cache")
Response.AppendHeader("Keep-Alive", "timeout=3, max=993")          
Response.AppendHeader("Expires", "Mon, 26 Jul 2006 05:00:00 GMT")
0
Bhushan Shimpi