Frage

Für meinen Blog möchte ich den Ausgabecache verwenden, um eine zwischengespeicherte Version eines bestimmten Beitrags etwa 10 Minuten lang zu speichern, und das ist in Ordnung ...

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

Wenn jedoch jemand einen Kommentar postet, möchte ich den Cache leeren, damit die Seite aktualisiert wird und der Kommentar sichtbar ist.

Wie mache ich das in ASP.Net C#?

War es hilfreich?

Lösung

Ich habe die Antwort gefunden, nach der ich gesucht habe:

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

Andere Tipps

Das oben Genannte ist in Ordnung, wenn Sie wissen, für welche Seiten Sie den Cache leeren möchten.In meiner Instanz (ASP.NET MVC) habe ich überall auf die gleichen Daten verwiesen.Deshalb wollte ich beim [Speichern] den Cache für die gesamte Site leeren.Folgendes hat bei mir funktioniert: http://aspalliance.com/668

Dies erfolgt im Kontext eines OnActionExecuting-Filters.Dies könnte genauso einfach durch Überschreiben von OnActionExecuting in einem BaseController oder so erfolgen.

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

Aufstellen:

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

Kleinere Änderung:Ich habe einen Helfer, der „Flash-Meldungen“ hinzufügt (Fehlermeldungen, Erfolgsmeldungen – „Dieses Element wurde erfolgreich gespeichert“ usw.).Um zu verhindern, dass die Flash-Nachricht bei jedem weiteren GET angezeigt wird, musste ich die Flash-Nachricht nach dem Schreiben ungültig machen.

Cache leeren:

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

Hoffe das hilft.

Verwenden von Response.AddCacheItemDependency zum Löschen aller Ausgabecaches.

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

Dies kann auch in OutputCachedPage von ASP.NET MVC verwendet werden.

Schreiben Sie bitte Folgendes in das Ladeereignis der Masterseite:

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

und klicken Sie in der Schaltfläche „Abmelden“ auf:

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

Hmm.Sie können ein VaryByCustom-Attribut für das OutputCache-Element angeben.Der Wert davon wird als Parameter an die GetVaryByCustomString-Methode übergeben, die Sie in global.asax implementieren können.Der von dieser Methode zurückgegebene Wert wird als Index für die zwischengespeicherten Elemente verwendet. Wenn Sie beispielsweise die Anzahl der Kommentare auf der Seite zurückgeben, wird jedes Mal, wenn ein Kommentar hinzugefügt wird, eine neue Seite zwischengespeichert.

Der Nachteil dabei ist, dass dadurch der Cache nicht wirklich geleert wird.Wenn ein Blogeintrag stark kommentiert wird, könnte Ihr Cache mit dieser Methode explodieren.

Alternativ könnten Sie die nicht veränderbaren Teile der Seite (die Navigation, Anzeigen, der eigentliche Blogeintrag) als Benutzersteuerelemente implementieren und für jedes dieser Benutzersteuerelemente ein teilweises Seiten-Caching implementieren.

Wenn Sie „*“ nur in die Parameter ändern, nach denen der Cache variieren soll (PostID?), können Sie etwa Folgendes tun:

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

und wenn jemand einen Kommentar hinzufügt...

Cache.Remove(key);

Ich denke, das würde sogar mit VaryByParam * funktionieren, da alle Anfragen an dieselbe Cache-Abhängigkeit gebunden wären.

Warum nicht die sqlcachedependency für die Posts-Tabelle verwenden?

sqlcachedependency msdn

Auf diese Weise implementieren Sie keinen benutzerdefinierten Cache-Löschcode und aktualisieren einfach den Cache, wenn sich der Inhalt in der Datenbank ändert?

HttpRuntime.Close() ..Ich probiere alle Methoden aus und dies ist die einzige, die für mich funktioniert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top