2009-09-17 53 views
5

我想在我的ASP.NET MVC網站中使用OutputCaching。問題是,當我嘗試更改一個查詢字符串參數的值時,它將返回請求的第一個項目的數據!緩存不正確在我的ASP.NET MVC網站?

這裏是我的代碼(與帕拉姆名稱變更)...

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • 注1:ApiAuthorize - 自定義屬性檢查所謂的「關鍵」查詢字符串PARAM並在內存中的字典檢查的,看看它是否存在。
  • 注2:HandleErrorAsJson - 自定義屬性,如果拋出異常,則返回錯誤消息爲json。

和這裏的兩個示例調用我正在做這個動作: -

所以從第一次調用數據(FOO = hello world,Pew Pew)以200 OK返回。 然後第二個api調用返回200 OK,但是使用前一個調用的數據。

此外,我沒有使用任何代理服務器。 如果我註釋掉OutputCache屬性,一切都很好。

我也試過以下(每次我需要手動緩存上市).....

[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")] 

沒有運氣:(

注意我需要如何確保我包含API'Key'參數作爲緩存唯一鍵的一部分我不想讓人們搜索同樣的東西,但如果第二個人沒有正確的鍵,他們不應該得到緩存的結果,但一個錯誤信息(技術上,這是一個401沒有授權,但無論如何)...

你亮燈?

回答

4

VaryByParam中的參數列表應該用分號分隔,而不是用逗號分隔。試試看。也就是說,*應該已經工作了。

+0

+1更直接關注手頭的問題。儘管我不認爲這是他在這裏唯一的問題。也在下面回覆你的評論。 – dove 2009-09-17 14:23:59

0

我使用了一個輸出緩存的過濾器,它可以爲調試提供編程控制,也可以在需要時進行設置。隨意使用,看看是否在這裏設置它將使我想可能(也確保任何以前的緩存清零)的區別

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.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
     } 
    } 

我只是用這個迄今非常靜態部分一個網站,所以有這樣的

[CacheFilter(DurationInDays = 1)] 

通話很明顯,你只是想擴大這種有VaryByParams暴露的屬性,可以提供但聽起來像是你知道該怎麼做。

+0

出於興趣,你爲什麼最終創建了自己的屬性,在這裏? – 2009-09-17 08:16:49

+0

我申請了一些意見,並會做更多。我對上面所看到的確切設置並不是100%,因此,我可以輕鬆調整並知道它適用於任何地方。我仍然不確定是否在設置緩存時添加更多標題。當然,如果我覺得這是一個糟糕的主意,我可以將其作爲OutputCache屬性的一個全新擴展,並且不會丟失任何內容。因此,總之,如果發生任何風險,有必要通過清晰的安全路徑獲得。 – dove 2009-09-17 08:51:45

+0

他在這裏做了什麼沒有錯,但它不能回答你的問題。他創建的過濾器影響*瀏覽器*緩存,而不是服務器緩存。這是合法的,我不知道任何內置於ASP.NET MVC的內容。它也隱含地提出了一個很好的觀點,那就是這裏有兩個不同的緩存,一個在瀏覽器中,另一個在服務器中。你的問題對我來說似乎與服務器緩存有關,不過用Firebug或Fiddler重新檢查一下會很好。 – 2009-09-17 13:29:41