2009-10-16 53 views
7

調用Asp.net的mvc的OutputCache屬性和滑動過期

http://foo/home/cachetest 

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

將顯示每10秒相同的內容,無論我怎麼會經常刷新頁面。

是否可以輕鬆添加滑動過期,以便在10秒後不會更改以防萬一我刷新了頁面?

回答

2

在讀的OutputCacheAttribute源,我不認爲有一個簡單的方式做到這一點。

你很可能需要創建自己的解決方案。

+0

謝謝。他們應該添加到Mvc2。 :/ – 2009-10-16 10:17:04

7

您可以創建自定義緩存過濾器,而不是默認的OutputCache之一。像下面這樣,注意可以在這裏設置滑動過期。注意,我沒有使用這個滑動到期,但適用於其他的事情。

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

似乎可能。但那不是'容易'。不管怎樣,謝謝。 ;) – 2009-10-16 10:06:54

1

你不能。 Cache類的內部定時器每20秒旋轉一次。我建議你嘗試在PokeIn庫下的PCache類。你可以設置爲6秒。而且,與.NET緩存類相比,PCache要快得多。