Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 23 de mayo de 2023
ASP.NET Core

Hace pocos meses hablábamos de la vuelta del clásico [OutputCache] en ASP.NET Core 7 y veíamos cómo podía simplificarnos la vida a la hora de cachear en el servidor respuestas de peticiones.

Haciendo un rápido recordatorio, la novedad era la posibilidad de introducir en el pipeline el middleware OutputCacheMiddleware, que se encargaría de almacenar las respuestas de endpoints y reutilizarlas en posteriores peticiones que cumplieran los requisitos apropiados.

Por ejemplo, la siguiente aplicación ASP.NET Core implementa un endpoint que simplemente muestra la fecha y hora actual, pero cacheando el resultado durante 5 segundos. Las peticiones recibidas durante ese intervalo no ejecutarán el handler, porque la respuesta será retornada directamente desde el middleware de cacheo:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOutputCache();

var app = builder.Build();
app.UseOutputCache();

app.MapGet("/", () => DateTime.Now)
    .CacheOutput(p => p.Expire(TimeSpan.FromSeconds(5)));

app.Run();

También veíamos en aquél post que era igualmente sencillo cachear el resultado de acciones de controladores MVC:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMvc();
builder.Services.AddOutputCache();

var app = builder.Build();
app.UseOutputCache();
app.MapControllers();
app.Run();

public class HomeController : Controller
{
    [HttpGet("/")]
    [OutputCache(Duration = 5)]
    public DateTime GetTime() => DateTime.Now;
}

Si por cualquier causa el contenido de la caché deja de ser válido, en ASP.NET Core disponemos de un mecanismo muy sencillo para invalidar entradas: las etiquetas.

A la hora de especificar las políticas de cacheado en un endpoint con el extensor CacheOutput(), podemos utilizar el método Tag() para etiquetar la entrada en la caché:

app.MapGet("/", () => DateTime.Now)
    .CacheOutput(p => p.Expire(TimeSpan.FromSeconds(30))
                       .Tag("MyTag")
    );

Y más adelante, si tenemos necesidad de invalidar las entradas que hayan sido cacheadas usando dicha etiqueta, podemos reclamar al inyector de dependencias una instancia de IOutputCacheStore y utilizar el método EvictByTagAsync() para forzar su eliminación de la caché. Por ejemplo, el siguiente código crea un endpoint en la ruta "/invalidate" que hace esto:

app.MapGet("/invalidate", async (IOutputCacheStore cacheStore) => 
    await cacheStore.EvictByTagAsync("MyTag", CancellationToken.None)
);

Lamentablemente, si desde MVC utilizamos el filtro [OutputCache] no tenemos forma de establecer la etiqueta, por lo que no podremos utilizar esta técnica. Pero bueno, un poco de paciencia, lo tendremos disponible en ASP.NET Core 8, dentro de unos meses, según indica este issue en el repositorio del proyecto en GitHub: Add tag trough OutputCacheAttribute #45842.

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!