2013-04-24 10 views
34

Korzystanie ASP.NET MVC 3 Mam kontroler, które wyjście jest buforowane za pomocą atrybutów [OutputCache]Jak unieważnić dane pamięci podręcznej [OutputCache] z kontrolera?

[OutputCache] 
public controllerA(){} 

Chciałbym wiedzieć, czy jest możliwe, aby unieważnić pamięć podręczna (serwer cache) dla określonego kontrolera lub ogólnie wszystkie dane buforu poprzez wywołanie innego kontrolera

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

Odpowiedz

50

Można użyć metody RemoveOutputCacheItem.

Oto przykład, jak można go używać: odpowiedź działanie

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

Indeks jest buforowane na serwerze przez 1 minutę. Jeśli trafisz na akcję InvalidateCacheForIndexAction, wygasa pamięć podręczna akcji indeksu. Obecnie nie ma możliwości unieważnienia całej pamięci podręcznej, powinieneś zrobić to za buforowaną akcję (nie kontroler), ponieważ metoda RemoveOutputCacheItem oczekuje adresu URL skryptu po stronie serwera, który jest przechowywany w pamięci podręcznej.

+0

Dziękuję Darin, naprawdę doceniam twoją pomoc w tym! – GibboK

+2

W jaki sposób osiągasz to dla -> Location = OutputCacheLocation.Client, czy istnieją inne specyficzne parametry/metody? –

+2

e10, nie można usunąć z serwera danych, które są buforowane w przeglądarce klienta. To nie ma sensu. –

2

można to zrobić za pomocą atrybutu niestandardowego, tak:

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

Następnie na swoje controllerb można zrobić:

[NoCache] 
public class controllerB 
{ 
} 
+3

Spowoduje to unieważnienie pamięci podręcznej po stronie klienta. Ale co, jeśli widoki ControllerA są buforowane na serwerze (co jest domyślnym zachowaniem)? –

+0

@DarinDimitrov To zmusi klienta do otrzymania nowej * nieobjętej * wersji z serwera. – mattytommo

+0

Tak, z ControllerB. Ale pyta, jak to zrobić z ControllerA, który był tym, który został ozdobiony atrybutem OutputCache w pierwszej kolejności. Odkąd urządziłeś ControllerB z atrybutem NoCache, nie zostanie on nigdy zapisany w pamięci podręcznej, ale nie sądzę, że właśnie o to tutaj pytamy. Chce wiedzieć, jak unieważnić pamięć podręczną kontrolera A, gdy ktoś wyśle ​​żądanie do kontrolera B, aby kolejne żądania kontrolera A nie były już buforowane. –

Powiązane problemy