2010-10-01 19 views
7

Sto appena iniziando a cercare nella cache per migliorare le prestazioni e ho una domanda sulla memorizzazione nella cache di una chiamata AJAX.Come funziona la memorizzazione nella cache di ASP.NET MVC per una richiesta AJAX?

Ho un'azione che viene utilizzata per interrogare Twitter e quindi restituire i risultati. Nel momento in cui un utente preme un pulsante carica una gif rotante mentre si avvia all'azione per eseguire la query e quindi restituisce una vista parziale. jQuery aggiorna quindi un div con la risposta HTML dalla vista. Normalmente questo richiede circa 5 secondi. Hanno quindi un pulsante più che si spegne per ottenere più risultati.

Cosa succede se metto CachingAttribute su questa azione? So che posso provarlo ma voglio solo spiegare il lato tecnico delle cose.

Grazie

ecco la mia 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; 
      }); 

Ecco la mia azione modificata:

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

risposta

11

Ecco come funziona: supponendo che non la cache specificata sul lato server, per impostazione predefinita Le richieste GET verranno memorizzate nella cache dal browser e le richieste POST non verranno memorizzate nella cache a meno che non si specifichi l'attributo cache: true quando si inviano richieste AJAX che consentono di sovrascrivere la strategia di memorizzazione nella cache del client.

Ora sul lato server è possibile decorare l'azione del controller con [OutputCache] che consente di definire diverse strategie di memorizzazione nella cache. È possibile mantenere una cache sul server, sui server proxy downstream o sul client. Puoi anche gestire diverse politiche di scadenza.

Quindi cerchiamo di illustrare con un esempio:

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

E sul lato client:

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

Il risultato di questa azione di controllo verrà memorizzata nella cache sul server per 10 secondi. Ciò significa che il server verrà colpito su ogni richiesta ma l'azione non verrà eseguita se è presente una versione memorizzata nella cache e verrà pubblicata direttamente da questa cache. 10 secondi dopo la prima richiesta che ha colpito l'azione del controller, la cache scadrà e lo stesso processo si ripeterà.

+0

Quindi, quando l'utente fa clic su più dati nella mia situazione, restituirà i primi 10 risultati più e più volte fino alla scadenza della cache? In tal caso, probabilmente non voglio usare una cache perché quando fanno clic su altri dati non può essere memorizzato nella cache – Jon

+0

@Jon, è possibile utilizzare la proprietà 'VaryByParam' per specificare un nome di parametro azione come ad esempio il numero di pagina. –

+0

VaryByParam può contenere un valore CSV di valori, ad esempio/se si dispone di 5 numeri di pagina? – Jon

Problemi correlati