2013-04-24 3 views
34

Mit ASP.Net MVC 3 Ich habe einen Controller, das Attribut Ausgabe zwischengespeichert wird [OutputCache]Wie können Cache-Daten [OutputCache] von einem Controller ungültig gemacht werden?

[OutputCache] 
public controllerA(){} 

mit Ich würde gerne wissen, ob es möglich ist, die Cache-Daten (Server-Cache) für einen bestimmten Controller ungültig zu machen oder generell alle Cache-Daten durch einen anderen Controller Aufruf

public controllerB(){} // Calling this invalidates the cache 

Antwort

50

Sie die RemoveOutputCacheItem Methode verwenden könnte.

Hier ist ein Beispiel dafür, wie Sie es verwenden könnte:

public class HomeController : Controller 
{ 
    [OutputCache(Duration = 60, Location = OutputCacheLocation.Server)] 
    public ActionResult Index() 
    { 
     return Content(DateTime.Now.ToLongTimeString()); 
    } 

    public ActionResult InvalidateCacheForIndexAction() 
    { 
     string path = Url.Action("index"); 
     Response.RemoveOutputCacheItem(path); 
     return Content("cache invalidated, you could now go back to the index action"); 
    } 
} 

Der Index Aktion Antwort auf dem Server für 1 Minute zwischengespeichert wird. Wenn Sie die Aktion InvalidateCacheForIndexAction drücken, wird der Cache für die Aktion "Index" ungültig. Gegenwärtig gibt es keine Möglichkeit, den gesamten Cache ungültig zu machen. Sie sollten dies pro Cache-Aktion tun (nicht Controller), weil die Methode RemoveOutputCacheItem die URL des serverseitigen Skripts erwartet, das sie zwischengespeichert hat.

+0

INVALIDATE zu geben. Danke, ich schätze deine Hilfe sehr! – GibboK

+2

Wie erreichen Sie dies für den -> Location = OutputCacheLocation.Client, gibt es andere spezifische Parameter/Methode? –

+2

e10, Sie können Daten, die im Client-Browser zwischengespeichert werden, nicht vom Server entfernen. Das ergibt keinen Sinn. –

2

Sie können das tun, indem Sie eine benutzerdefinierte Attribut, etwa so:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class NoCacheAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 

     base.OnResultExecuting(filterContext); 
    } 
} 

Dann auf Ihrem controllerb Sie tun können:

[NoCache] 
public class controllerB 
{ 
} 
+3

Dadurch wird der clientseitige Cache ungültig. Was aber, wenn die Ansichten von ControllerA auf dem Server zwischengespeichert werden (was ist das Standardverhalten)? –

+0

@DarinDimitrov Dies wird den Client zwingen, eine neue * nicht-cache * Version vom Server zu bekommen. – mattytommo

+0

Ja, von ControllerB. Aber er fragt, wie man das mit ControllerA macht, das mit dem OutputCache-Attribut ausgestattet war. Da Sie ControllerB mit dem NoCache-Attribut dekoriert haben, wird es nie im Cache gespeichert, aber ich denke nicht, dass dies hier gefragt wird. Er möchte wissen, wie der Cache von ControllerA ungültig gemacht wird, wenn jemand eine Anfrage an ControllerB sendet, so dass nachfolgende Anfragen an ControllerA nicht mehr zwischengespeichert werden. –

Verwandte Themen