2009-10-16 6 views
7

AppelAsp.net Mvc OutputCache attribut et en faisant glisser l'expiration

http://foo/home/cachetest 

pour

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

montrera le même contenu pour toutes les 10 secondes, peu importe à quelle fréquence je rafraîchir la page.

Est-il possible d'ajouter facilement l'expiration coulissante afin qu'elle ne change pas après 10 secondes au cas où j'ai rafraîchi la page?

Répondre

2

lu la source pour le OutputCacheAttribute et je ne pense pas qu'il y ait un facile façon de le faire.

Vous aurez probablement besoin de créer votre propre solution.

+0

Merci. Ils devraient ajouter cela à Mvc2. : / –

7

Vous pouvez créer un filtre de cache personnalisé au lieu de celui par défaut de OutputCache. Comme ci-dessous, notez que l'expiration coulissante peut être réglée ici. Avertissez en ce que je n'ai pas employé ceci pour l'expiration coulissante, mais fonctionne bien pour d'autres choses.

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

Cela semble possible. Mais ce n'est pas "facilement". Quoi qu'il en soit - merci. ;) –

1

Vous ne pouvez pas. Le temporisateur interne de la classe Cache tourne toutes les 20 secondes. Je vous suggère d'essayer la classe PCache sous la bibliothèque PokeIn. Vous pouvez définir à 6 secondes sur elle. En outre, PCache beaucoup plus rapide par rapport à la classe de cache .NET.

Questions connexes