This article has been localized into Spanish by the community.
ResponseCache
Cómo discutimos en el artículo de introducción para este capítulo, todo los exploradores modernos vienen con una funcionalidad integrada de cacheo. Ellos siempre intentarán detectar cosas estáticas como imágenes y hojas de estilo, y cachear estos para la siguiente solicitud hecha por el usuario. Esto no aplica para la página actual, porque el explorador no tiene forma de saber si tu servidor servida la misma respuesta exacta en la siguiente petición o no. Eso no significa qué cachear la página no sea posible, sólo significa que tienes que guiar al explorador. Para ese propósito, ASP.NET MVC viene con una técnica llamada ResponseCache.
ResponseCache, algunas veces referido como cacheo de respuestas basados en HTTP, es más comúnmente aplicada directamente a la acción de un controlador, para dejar al explorador saber que puede cachear de forma segura la respuesta por un monto de tiempo específico. Así que, si el resultado de tu acción de controlador es siempre estático, o al menos permanece igual por un monto de tiempo específico, puedes decirle al explorador que lo cachee como esto:
public class CacheController : Controller
{
[ResponseCache(Duration = 120)]
public IActionResult Index()
{
return View();
}
}
Con eso en su lugar, el explorador solicitando la página tendrá permiso para cachear la respuesta de la solicitud por 2 minutos(segundos). Esto será notable en los encabezados de respuesta, los cuales puedes inspeccionar en las herramientas de desarrollador de tu explorador (en Google Chrome es DevTools) dónde podrás ver un encabezado de respuesta como éste:
Cache-Control: public,max-age=120
Pero por favor nota una cosa muy importante: Esta es sólo una recomendación hecha al explorador. En cualquier momento, el explorador es libre de ignorar esta recomendación y volver a solicitar la página . Esto pasará, por ejemplo, si el usuario presiona el botón de refrescar de El explorador en lugar de simplemente navegar a la página cacheada al hacer clic en un link.
Variar opciones
En el ejemplo de arriba, páginas era cacheada no importa qué, pero en muchas situaciones, tu página puede cambiar dependiendo de cómo el usuario accesa. Por ejemplo, puedes usar parámetros en la cadena de consulta para entregar diferente contenido basado en como el usuario la solicita, como esto:
/Users/Details?id=1
/Users/Details?id=2
....
Para una situación como esa, tú quieres asegurarte que la página details para el usuario #1 no sea cacheado y mostrado para el usuario #2. Afortunadamente para nosotros la directiva ResponseCache viene con opciones para variar el contenido basado en la cadena de consulta, pero requiere el llamado middleware ResponseCache. En otras palabras necesitas agregar este paquete NuGet a tu proyecto y luego referenciarlo en tu archivo Startup.cs, donde también tendrás que agregar líneas de código como esto:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseResponseCaching();
app.UseMvcWithDefaultRoute();
}
}
Las líneas en cuestión son las que tienen services.AddResponseCaching() y app.UseResponseCaching(). Con eso en su lugar, ahora puedes usar el parámetro VaryByQueryKeys:
[ResponseCache(Duration = 120, VaryByQueryKeys = new[] { "id" })]
public IActionResult Details(int id)
{
...
Ahora, la página solicitada solamente será cacheada sí el parámetro id es el mismo. Puedes especificar múltiples parámetros para variar, o puedes usar un asterisco sí quieres variar por todos los parámetros posibles.
[ResponseCache(Duration = 120, VaryByQueryKeys = new[] { "*" })]
VaryByHeader
Puedes también variar el contenido basado en encabezados enviados al servidor desde el cliente, por ejemplo "User Agent" que identifica al cliente (un explorador web). Puede ser usado así:
[ResponseCache(Duration = 120, VaryByHeader = "User-Agent" )]
Resumen
La directiva ResponseCache te permite instruir al cliente visitante en como puede o no cachear tus páginas. Sin embargo, ten en mente que esto es solo una recomendación para cada cliente, el monto de recursos y el ancho de banda ahorrado no será tan grande como sí tuvieras el control total. Hablaremos mas sobre eso en el siguiente artículo.