TOC

This article has been localized into Spanish by the community.

Caching:

OutputCache

En ASP.NET WebForms, tanto como en versiones de ASP.NET MVC antes del framework Core, el concepto de OutputCache existió. Esto hizo extremadamente fácil cachear páginas/vistas enteras, justo como vimos con el ResponseCache en el artículo previo, pero almacenado en memoria en el servidor web.

El concepto de OutputCache no ha logrado estar en la versión Core del framework .NET, al momento de la redacción de esto, pero afortunadamente para nosotros, la comunidad ha desarrollado una versión, basada en cacheo en memoria, la cual te da las mismas oportunidades que las características de OutputCache que fue integrada en versiones previas. De hecho, hay varias implementaciones por ahí, pero basaré este artículo en el paquete NuGet WebEssentials.AspNetCore.OutputCaching.

Tan pronto como hayas instalado este paquete en tu proyecto, solo necesitas hacer un par de pequeños ajustes en tu archivo Startup.cs, para empezar a usar la directiva OutputCache:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
services.AddOutputCaching();    
services.AddMvc();    
    }
   
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
app.UseOutputCaching();    
app.UseMvcWithDefaultRoute();
    }
}

Esta "magia" ocurre en la llamada a services.AddOutputCaching() y app.UseOutputCaching(). Ahora tu sitio web soporta cacheo de salida y puedes empezar a usarlo así:

[OutputCache(Duration = 120)]
public IActionResult Index()
{    
...

Ahora, tu página es cacheada en la memoria del servidor web por 120 segundos o solamente será generada en la primera solicitud (y luego de nuevo cuando el cache expire). Sí quieres verificar esto, puedes empezar a debugear el proyecto después de poner un breakpoint dentro del método o acción, o puedes pasarle una instancia DateTime y luego mostarla en la salida en la Vista como esto:

Controller:

[OutputCache(Duration = 120)]
public IActionResult Index()
{    
    return View(DateTime.Now);
}

View:

@model DateTime

Time of request: @Model.ToString()

Intenta solicitar la página y nota que la fecha y tiempo permanece iguales, incluso cuando recargas la página, hasta que el cache expire.

Opciones de OutputCache

Ya hemos usado una muy importante opción cuando usamos OutputCache. La Duration (duración). Este le dirá al framework cuanto puede depender en la versión cacheada, antes de que necesite ser refresescada. Hay varias opciones relevantes:

VaryByParam

Sin ninguna otra opción que la Duración, la solicitud sera cacheada sin importar que y servida a todos los demás usuarios, pero en muchas situaciones, tu página puede ser cacheada dependiendo del usuario que la accese. Por ejemplo, puedes usar parámetros en la cadena de consulta para servir diferente contenido basado en como el usuario lo solicita, como esto:

/Users/Details?id=1
/Users/Details?id=2
....

En una situación como esta, quieres cambiar el cacheo para tomar el parámetro del nombre "id" en consideración cuando cacheas el contenido. Esto es logrado fácilmente usando la opción VaryByParam:

[OutputCache(Duration = 120, VaryByParam = "id")]
public IActionResult Details(int id)
{
    return View(id);
}

Múltiples versiones de la vista Details pueden existir en la cache, dependiendo de cual valor fue pasado al parámetro id. Puedes especificar nombres de múltiples parámetros, como esto:

[OutputCache(Duration = 120, VaryByParam = "id,page,time")]
public IActionResult Details(int id)
{
...

VaryByHeader

Puedes también variar el contenido basado en los encabezados enviados al servidor desde el ciente, por ejemplo "User Agent" que identifica a un cliente (un explorador web). Puede ser usado como esto:

[OutputCache(Duration = 120, VaryByHeader = "User-Agent")]
public IActionResult Index()
{    
    return View(DateTime.Now);
}

Esto variará el contenido basado en cual explorador es usado, y hay desde luego muchos otros tipos de encabezados que puedes usar - para inspiración, echa un vistazo a esta lista de campos de encabezado HTTP.

Resumen

Gracias al paquete NuGet OutputCaching, puedes tener el mismo tipo de funcionalidad de OutputCache como se encontraba previamente en ASP.NET WebForms y versiones previas del framework MVC.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!