2013-05-13 13 views
24

Wie lösche ich den Server-Cache in asp.net? Ich habe herausgefunden, dass es zwei Arten von Cache gibt. Es gibt den Browser-Cache und den Server-Cache. Ich habe einige Suchen durchgeführt, aber ich muss noch eine klare Schritt-für-Schritt-Anleitung zum Löschen des Server-Cache mit asp.net (oder nicht) finden.Wie lösche ich den Server-Cache in asp.net?

(update) Ich habe gerade gelernt, dass der Code-Behind dafür in VB - Visual Basic (dot net) ist.

+1

Ich würde Versuchen Sie, die Site in IIS neu zu starten oder den Anwendungspool möglicherweise zu recyceln. Andernfalls könnten Sie eine Seite verfügbar machen, die alles manuell aus dem Cache löscht. – millimoose

+0

@xarzu Unter welchen Umständen möchten Sie den Cache löschen? –

Antwort

36

Sie könnten Schleife durch alle Elemente Cache und löschen Sie sie eins nach dem anderen:

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

Syntax Korrektur für ASP.NET 4.5 C#

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

+1 @Kenneth, aber ich denke, du meintest 'foreach' und' entry' statt 'de'. – itsme86

+0

Ja, ich weiß nicht, wie ich das gemacht habe :-) – Kenneth

+0

Sie haben mich auf diesen Teil meiner Frage geschlagen, also habe ich es aus meiner Antwort rausgeschmissen. Gute Antwort. +1 – Greg

1

Hier finden Sie die Elemente entfernen, müssen Sie Habe zum Cache hinzugefügt:

+1

wo ist der Wert von enumerator.Key set? – SeanKPS

2

Ich bin mir nicht sicher über die genaue Methodik, in der Sie mitmachen möchten lish das. Aber es gibt ein paar Möglichkeiten, ein Weg ist der, den Giorgio Minardi geschrieben hat, der aus dieser question stammt.

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

die erfolgreich recyceln Ihren Anwendungspool:

Die anderen Optionen wie dies sein könnten. Was würde den Cache löschen. Du hast ein paar Möglichkeiten. Vorsicht, obwohl dadurch der Cache gelöscht wird, werden auch alle bestehenden Sitzungen beendet.

Hoffentlich hilft das.

+2

Ja, und wenn Sie den Server zurücksetzen, wird auch der Cache gelöscht.Das ist ein bisschen Overkill für was das OP will – Kenneth

+0

@Kenneth Ja, aber ich war mir nicht sicher, wie er das klar machen wollte. Oder, in welcher Umgebung er es tun würde. Ich dachte, ich würde einen alternativen Ansatz geben, der immer noch praktikabel ist, solange er den spezifischen Anwendungsparameter hinein gibt. Es würde nur die eine klären. – Greg

+1

Sie sollten Ihrer Antwort eine Notiz hinzufügen, dass Sie damit alle Sitzungen, alle Daten im Application-Objekt und alle ausgeführten Anfragen löschen. – Kenneth

7

Es gibt ein Problem mit der Iteration: Es ist nicht threadsicher. Wenn Sie iterieren und auf den Cache von einem anderen Thread aus zugreifen, erhalten Sie möglicherweise einen Fehler. Die Wahrscheinlichkeit dafür ist gering, aber es ist ein Problem mit Anwendungen mit hoher Last. FYI, einige Cache-Implementierungen bieten nicht einmal Iterationsmethoden.

Wenn Sie Ihre Cache-Elemente löschen, möchten Sie nicht alles aus allen Bereichen der App-Domäne löschen, sondern nur, was mit Ihnen zusammenhängt.

Als ich mit diesem Problem konfrontiert wurde, löste ich es, indem ich eine benutzerdefinierte CacheDependency zu allen meinen Cache-Einträgen hinzufügte.

Dies ist, wie die CacheDependency definiert:

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

Oder verwenden Sie einfach "lock (HttpContext.Current.Cache)", um es threadsicher zu machen. – Undercover1989

1

System.Web.HttpRuntime.UnloadAppDomain() - startet Web-Anwendung, löscht Cache, setzt css/js Bündel

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

Hinzufügen eines erklärenden Textes zusammen mit Ihrer Antwort wird sicherlich anderen Benutzern mit ähnlichen Fragen helfen. Bitte überlegen Sie, ob Sie ... –

Verwandte Themen