2009-10-16 23 views
7

scorrevole CallingAsp.net MVC OutputCache e la scadenza

http://foo/home/cachetest 

per

[UrlRoute(Path = "home/cachetest")] 
[OutputCache(Duration = 10, VaryByParam = "none")] 
public ActionResult CacheTest() 
{ 
    return Content(DateTime.Now.ToString()); 
} 

mostrerà lo stesso contenuto per ogni 10 secondi non importa quante volte ho refresh della pagina.

E 'possibile aggiungere facilmente scadenza variabile in modo che non sarebbe cambiato dopo 10 secondi nel caso in cui ho rinfrescato la pagina?

risposta

2

leggendo la sorgente per il OutputCacheAttribute e non credo che ci sia un facile modo per farlo.

Probabilmente avrai bisogno di creare la tua soluzione.

+0

Grazie. Dovrebbero aggiungerlo a Mvc2. : / –

7

È possibile creare un filtro cache personalizzato anziché uno OutputCache predefinito. Come questo qui sotto, nota che la scadenza di scorrimento potrebbe essere impostata qui. Ho avvertito che non l'ho usato per scorrere la scadenza, ma funziona bene per altre cose.

public class CacheFilterAttribute : ActionFilterAttribute 
    { 
     private const int Second = 1; 
     private const int Minute = 60 * Second; 
     private const int Hour = 60 * Minute; 
     public const int SecondsInDay = Hour * 24; 


     /// <summary> 
     /// Gets or sets the cache duration in seconds. 
     /// The default is 10 seconds. 
     /// </summary> 
     /// <value>The cache duration in seconds.</value> 
     public int Duration 
     { 
      get; 
      set; 
     } 

     public int DurationInDays 
     { 
      get { return Duration/SecondsInDay; } 
      set { Duration = value * SecondsInDay; } 
     } 

     public CacheFilterAttribute() 
     { 
      Duration = 10; 
     } 

     public override void OnActionExecuted(
           ActionExecutedContext filterContext) 
     { 
      if (Duration <= 0) return; 

      HttpCachePolicyBase cache = 
        filterContext.HttpContext.Response.Cache; 
      TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration); 

      cache.SetCacheability(HttpCacheability.Public); 
      cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
      cache.SetMaxAge(cacheDuration); 
      cache.SetSlidingExpiration(true); 
      cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
     } 
    } 
+0

Sembra possibile. Ma non è "facilmente". Comunque grazie. ;) –

1

Non è possibile. Il timer interno della classe cache ruota ogni 20 secondi. Ti suggerisco di provare la classe PCache sotto la libreria PokeIn. È possibile impostare fino a 6 secondi su di esso. Inoltre, PCache è molto più veloce rispetto alla classe della cache .NET.