2010-10-01 10 views
7

Estoy empezando a buscar en el almacenamiento en caché para mejorar el rendimiento y tengo una pregunta sobre el almacenamiento en caché de una llamada AJAX.¿Cómo funciona el almacenamiento en caché ASP.NET MVC para una solicitud AJAX?

Tengo una acción que se utiliza para consultar Twitter y luego devolver los resultados. En el momento en que un usuario presiona un botón, carga un gif giratorio mientras se dirige a la acción para realizar la consulta y luego devolver una vista parcial. jQuery luego actualiza un div con la respuesta HTML de la vista. Normalmente esto lleva alrededor de 5 segundos. Luego tienen un botón más que se activa para obtener más resultados.

¿Qué pasará si coloco CachingAttribute sobre esta acción? Sé que puedo intentarlo, pero solo quiero que se explique el lado técnico de las cosas.

Gracias

Aquí está mi 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; 
      }); 

Aquí está mi acción modificación:

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

Respuesta

11

Así es como funciona: suponiendo que no hay almacenamiento en caché especificada en el lado del servidor, por defecto Las solicitudes GET serán almacenadas en caché por el navegador y las solicitudes POST no almacenadas en caché a menos que especifique el atributo cache: true al enviar las solicitudes AJAX lo que le permite anula la estrategia de almacenamiento en caché del cliente.

Ahora en el lado del servidor puede decorar la acción de su controlador con [OutputCache] que le permitirá definir diferentes estrategias de almacenamiento en caché. Puede mantener un caché en el servidor, en servidores proxy indirectos o en el cliente. También puede administrar diferentes políticas de caducidad.

Así que vamos a ilustrar esto con un ejemplo:

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

Y en el lado del cliente:

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

El resultado de esta acción del controlador se almacenan en caché en el servidor durante 10 segundos. Esto significa que se tocará el servidor en cada solicitud, pero la acción no se ejecutará si hay una versión en caché y se servirá directamente desde esta caché. 10 segundos después de la primera solicitud que golpeó la acción del controlador, la caché caducará y se repite el mismo proceso.

+0

Entonces, cuando el usuario haga clic para obtener más datos en mi situación, devolverá los primeros 10 resultados una y otra vez hasta que se agote la caché. En ese caso, probablemente no quiera utilizar un caché porque cuando hacen clic para obtener más datos no pueden almacenarse en caché – Jon

+0

@Jon, puede usar la propiedad 'VaryByParam' para especificar un nombre de parámetro de acción como, por ejemplo, el número de página. –

+0

¿Puede VaryByParam contener un CSV de valores, por ejemplo,/si tiene 5 números de página? – Jon

Cuestiones relacionadas