2009-10-16 14 views
7

deslizamiento CallingAsp.net MVC OutputCache atributo y expiración

http://foo/home/cachetest 

para

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

mostrará el mismo contenido por cada 10 segundos, no importa con qué frecuencia i actualización de la página.

¿Es posible agregar fácilmente la expiración deslizante para que NO cambie después de 10 segundos en caso de que haya refrescado la página?

Respuesta

2

estado leyendo la fuente para la OutputCacheAttribute y no creo que hay una fácil manera de hacer esto.

Es muy probable que necesite crear su propia solución.

+0

Gracias. Deberían agregar eso a Mvc2. : / –

7

Puede crear un filtro de caché personalizado en lugar de uno predeterminado de OutputCache. Al igual que a continuación, tenga en cuenta que la expiración deslizante se puede establecer aquí. Tenga en cuenta que no he usado esto para la expiración deslizante, pero funciona bien para otras cosas.

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

Parece posible. Pero eso no es 'fácil'. Gracias de todos modos. ;) –

1

No puede. El temporizador interno de la clase de caché gira cada 20 segundos. Le sugiero que pruebe la clase PCache en la biblioteca PokeIn. Puede establecer hasta 6 segundos en él. Además, PCache es mucho más rápido en comparación con la clase de caché .NET.

Cuestiones relacionadas