2013-04-24 13 views
34

Ben Belirli Bir Kontrolör için veya Cache Verilerini (SUNUCU ÖNBELLEĞİ) geçersiz kılmak için mümkün olup olmadığını bilmek istiyorum çıkış özelliklerini [OutputCache]Önbellek verisi [OutputCache] bir Denetleyiciden nasıl geçersiz kılınır? ASP.Net MVC 3 Kullanılması

[OutputCache] 
public controllerA(){} 

kullanılarak önbelleğe olan bir Kontrolör var başka bir denetleyici arayarak genellikle bütün Önbellek verileri

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

cevap

50

Sen RemoveOutputCacheItem yöntemi kullanabilirsiniz.

Burada nasıl kullanılacağını gösteren bir örnek:

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

Endeksi eylem tepkisi 1 dakika boyunca sunucuda önbelleğe alınır. InvalidateCacheForIndexAction eylemine çarparsanız, Dizin eyleminin önbelleğinin geçerliliğini kaybeder. Şu anda, tüm önbelleği geçersiz kılmanın bir yolu yoktur, önbelleğe alınmış eylem (denetleyici değil) için yapmalısınız çünkü RemoveOutputCacheItem yöntemi, önbelleğe aldığı sunucu tarafı komut dosyasının url'sini bekler.

+0

Teşekkürler Darin, bu konuda yardımın için minnettarım! – GibboK

+2

Bunu -> Konum = OutputCacheLocation.Client için nasıl başarırsınız, başka spesifik parametreler/yöntem var mı? –

+2

e10, istemci tarayıcısında önbelleğe alınan verileri sunucudan kaldıramazsınız. Bu mantıklı değil. –

2

bunu yapabilirsiniz, böylece gibi özel bir özelliğini kullanarak:

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

senin controllerb Yapabileceğiniz:

[NoCache] 
public class controllerB 
{ 
} 
+3

Bu, istemci tarafı önbelleğini geçersiz kılar. Ancak, ControllerA'nın görünümleri sunucuda önbelleğe alınmışsa (varsayılan davranış)? –

+0

@DarinDimitrov Bu, istemciyi sunucudan yeni * kaldırılmamış * sürümü almaya zorlar. – mattytommo

+0

Evet, ControllerB'den. Ama o ilk olarak OutputCache özniteliği ile dekore edilmiş olan ControllerA ile bunu nasıl yapılacağını soruyor. ControllerB'yi NoCache özniteliği ile süslediğinizden, hiçbir zaman önbelleğe alınmayacaktır ancak bunun burada sorulmakta olduğunu düşünmüyorum. Birisi ControllerB'ye bir istek gönderdiğinde ControllerA'nın önbelleğini geçersiz kılmayı bilmek istiyor, böylece ControllerA'ya daha sonraki istekler artık önbelleğe alınmıyor. –