2010-10-01 58 views
7

我只是開始尋找緩存來提高性能,並對緩存AJAX調用有一個問題。ASP.NET MVC緩存如何爲AJAX請求工作?

我有一個操作,用於查詢Twitter,然後返回結果。在用戶按下按鈕的時候,它會加載一個旋轉的gif,同時它將執行查詢並返回一個局部視圖。然後jQuery用來自視圖的HTML響應更新div。通常這需要5秒左右。然後他們有一個更多的按鈕,以獲得更多的結果。

如果我把CachingAttribute放在這個動作上會發生什麼?我知道我可以嘗試,但我只想解釋事物的技術方面。

感謝

這裏是我的javascript:

$('#blogEntryList #moreLink').live("click", function() { 


       $('#morespan').toggle(); 
       $('#loader').toggle(); 

       $.get($(this).attr("href"), function(response) { 
        $('#blogEntryList ol').append($("ol", response).html()); 
        $('#blogEntryList #moreLink').replaceWith($("#moreLink", response)); 
        $('#loader').hide(); 
        $('#morespan').show(); 
       }); 
       return false; 
      }); 

這裏是我的修改操作:

[OutputCache(
    Location = OutputCacheLocation.Server, 
    Duration = 100, 
    VaryByParam = "")] 
     public ActionResult BlogPosts(int? entryCount) 
     { 
      if (!entryCount.HasValue) 
       entryCount = defaultEntryCount; 

      int page = entryCount.Value/defaultEntryCount; 

      IEnumerable<BlogData> pagedEntries = GetLatestEntries(page, defaultEntryCount); 

      if (entryCount < totalItems) 
       AddMoreUrlToViewData(entryCount.Value); 

      return View("BlogEntries", pagedEntries); 
     } 

回答

11

下面是它如何工作的:假設沒有在服務器端指定緩存,默認除非您在發送AJAX請求時指定cache: true屬性,否則瀏覽器將緩存GET請求,並且POST請求不會被緩存,除非您在發送AJAX請求時指定cache: true屬性,覆蓋客戶端緩存策略。

現在在服務器端,你可以裝飾與[OutputCache] 你的控制器動作,這將允許你定義不同的緩存策略。您可以在服務器,下游代理服務器或客戶端上保留緩存。您還可以管理不同的過期策略。

因此,讓我們說明這個用一個例子:

[OutputCache(
    Location = OutputCacheLocation.Server, 
    Duration = 10, 
    VaryByParam = "")] 
public ActionResult Hello() 
{ 
    return Content(DateTime.Now.ToLongTimeString(), "text/plain"); 
} 

而且在客戶端:

$.ajax({ 
    url: '/home/hello', 
    type: 'post', 
    success: function (result) { 
     alert(result); 
    } 
}); 

該控制器操作的結果將在服務器上的10秒緩存。這意味着服務器將在每個請求中被命中,但如果存在緩存版本並且將直接從該緩存提供服務,則該操作不會被執行。從命中控制器動作的第一個請求開始10秒鐘後,緩存將過期並重復相同的過程。

+0

因此,當用戶在我的情況下點擊更多數據時,它會一次又一次返回前10個結果,直到緩存過期結束?在這種情況下,我可能不想使用緩存,因爲當他們點擊更多的數據時,它不能被緩存 – Jon 2010-10-01 20:03:39

+0

@Jon,你可以使用'VaryByParam'屬性來指定一個動作參數名稱,例如頁碼。 – 2010-10-02 08:49:36

+0

Can VaryByParam可以包含一個CSV值,例如/如果您有5個頁碼? – Jon 2010-10-02 10:00:07