2013-05-13 13 views
24

Come svuotare la cache del server in asp.net? Ho scoperto che ci sono due tipi di cache. C'è la cache del browser e la cache del server. Ho effettuato alcune ricerche ma non ho ancora trovato una guida chiara e dettagliata per svuotare la cache del server usando asp.net (o meno).Come svuotare la cache del server in asp.net?

(aggiornamento) Ho appena appreso che il code-behind per questo è in VB - Visual Basic (dot net).

+1

mi piacerebbe prova a riavviare il sito in IIS o a riciclare il pool di applicazioni. Altrimenti potresti esporre una pagina che cancella manualmente tutto dalla cache. – millimoose

+0

@xarzu In quali circostanze si desidera cancellare la cache? –

risposta

36

Si potrebbe ciclo tra tutti gli elementi della cache e cancellare uno per uno:

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

Correzione di sintassi per ASP.NET 4.5 C#

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

+1 @Kenneth, ma penso che tu intendessi 'foreach' e' entry' invece di 'de'. – itsme86

+0

Sì, non so come l'ho fatto :-) – Kenneth

+0

Mi hai battuto in quella parte della mia domanda, così l'ho buttato fuori dalla mia risposta. Bella risposta. +1 – Greg

1

Avrai bisogno di rimuovere gli elementi che si Ho aggiunto alla cache:

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

while (itemsInCache.MoveNext()) 
{ 

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

} 
+1

dove è il valore di enumerator.Key impostato? – SeanKPS

2

Non sono sicuro della metodologia esatta in cui si desidera accompagnare questo Ma ci sono alcuni modi, uno è quello pubblicato da Giorgio Minardi che proviene da questo question.

Le altre scelte potrebbero essere simile a questo:

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

Che riciclare con successo il vostro pool di applicazioni. Quale cancellerebbe la cache. Hai alcune scelte. Attenzione, anche se questo cancellerà la cache, terminerà anche qualsiasi sessione esistente.

Speriamo che questo aiuti.

+2

Sì, e se si resetta il server, cancellerà anche la cache.Questo è un po 'eccessivo per quello che l'OP vuole – Kenneth

+0

@Kenneth Sì, ma non ero sicuro di come volesse ottenere il risultato. O in quale ambiente lo farebbe. Pensavo che darei un approccio alternativo che è ancora fattibile, a condizione che passi il parametro specifico dell'applicazione al suo interno. Risulterà solo quello. – Greg

+1

Dovresti aggiungere una nota alla tua risposta che con questo stai anche uccidendo qualsiasi sessione, tutti i dati che hai nell'oggetto Application e le eventuali richieste che stanno eseguendo. – Kenneth

7

C'è un problema con l'iterazione: non è thread-safe. Se si sta iterando e si accede alla cache da un altro thread, è possibile che si sia verificato un errore. La probabilità di questo è bassa, ma è un problema con le applicazioni ad alto carico. FYI, alcune implementazioni della cache non forniscono nemmeno i metodi di iterazione.

Inoltre, se si eliminano gli elementi della cache, non si desidera cancellare tutto da ogni parte del dominio dell'app, ma solo ciò che è correlato all'utente.

Quando ho affrontato questo problema, l'ho risolto aggiungendo una CacheDependency personalizzata a tutte le voci della cache.

questo è come il CacheDependency è definito:

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 
+0

O semplicemente utilizzare "lock (HttpContext.Current.Cache)" per renderlo thread-safe. – Undercover1989

1

System.Web.HttpRuntime.UnloadAppDomain() - riavvio dell'applicazione web, cancella la cache, azzera css/js fasci

1
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

L'aggiunta di un testo esplicativo insieme alla risposta aiuterà sicuramente gli altri utenti con domande simili. Si prega di considerare l'aggiunta ... –

Problemi correlati