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).
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);
}
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
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.
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]);
}
System.Web.HttpRuntime.UnloadAppDomain () - redémarre l'application Web, efface le cache, réinitialise les ensembles css/js
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);
}
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")