2010-10-01 18 views
7

Właśnie zaczynam szukać buforowania, aby poprawić wydajność i pytanie o buforowanie wywołania AJAX.Jak działa buforowanie ASP.NET MVC dla żądania AJAX?

Mam akcję, która służy do wysyłania zapytań do twittera, a następnie zwracania wyników. W momencie, gdy użytkownik naciśnie przycisk, ładuje obracający się GIF, podczas gdy przechodzi do akcji, aby wykonać zapytanie, a następnie zwraca częściowy widok. Następnie jQuery aktualizuje element div za pomocą odpowiedzi HTML z widoku. Zwykle zajmuje to około 5 sekund. Następnie mają więcej przycisku, który uruchamia się, aby uzyskać więcej wyników.

Co się stanie, jeśli ustawię CachingAttribute na tę akcję? Wiem, że mogę to wypróbować, ale chcę tylko wyjaśnić techniczną stronę rzeczy.

Dzięki

Oto mój 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; 
      }); 

Oto mój zmodyfikowany Działanie:

[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); 
     } 

Odpowiedz

11

Oto jak to działa: zakładając brak buforowania podane na stronie serwera, domyślnie Żądania GET będą buforowane przez przeglądarkę, a żądania POST nie będą buforowane, chyba że określisz atrybut cache: true podczas wysyłania żądań AJAX, co pozwala zastępuje strategię buforowania klienta.

Teraz po stronie serwera można udekorować działanie kontrolera za pomocą [OutputCache] , co pozwoli na zdefiniowanie różnych strategii buforowania. Możesz przechowywać pamięć podręczną na serwerze, na serwerach proxy lub na kliencie. Możesz także zarządzać różnymi zasadami wygaśnięcia.

Więc zilustrować to na przykładzie:

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

A po stronie klienta:

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

Wynik tego działania kontrolera będą buforowane na serwerze przez 10 sekund. Oznacza to, że serwer zostanie trafiony przy każdym żądaniu, ale akcja nie zostanie wykonana, jeśli istnieje wersja buforowana i będzie bezpośrednio obsługiwana z tej pamięci podręcznej. 10 sekund później od pierwszego żądania, które uderzyło w akcję kontrolera, pamięć podręczna wygaśnie i ten sam proces się powtarza.

+0

Kiedy użytkownik kliknie więcej danych w mojej sytuacji, zwróci raz 10 pierwszych wyników, dopóki nie wygaśnie wygaśnięcie pamięci podręcznej? W takim przypadku prawdopodobnie nie będę chciał używać pamięci podręcznej, ponieważ gdy klikną więcej danych, nie można ich zapisać w pamięci podręcznej. – Jon

+0

@Jon, można użyć właściwości 'VaryByParam' w celu określenia nazwy parametru akcji, na przykład numeru strony. –

+0

Czy VaryByParam może zawierać CSV wartości np./Jeśli masz 5 numerów stron? – Jon

Powiązane problemy