Para melhorar o desempenho em páginas com conteúdo estático, como artigos de notícias, podemos usar o IResourceFilter no ASP.NET Core para armazenar em cache os resultados das ações do controlador. Isso reduz a carga no banco de dados e acelera a resposta da aplicação.
Criação do Atributo de Filtro de Cache
Primeiro, definimos um filtro personalizado que implementa a interface IResourceFilter. Este filtro utiliza um dicionário estático para armazenar os resultados das requisições com base no caminho da URL.
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Collections.Concurrent;
namespace FiltrosCustomizados
{
public class AtributoCacheFiltro : Attribute, IResourceFilter
{
private static readonly ConcurrentDictionary<string, object> _armazenamentoCache = new ConcurrentDictionary<string, object>();
public void OnResourceExecuted(ResourceExecutedContext contexto)
{
var rota = contexto.HttpContext.Request.Path.Value;
_armazenamentoCache[rota] = contexto.Result;
}
public void OnResourceExecuting(ResourceExecutingContext contexto)
{
var rota = contexto.HttpContext.Request.Path.Value;
if (_armazenamentoCache.TryGetValue(rota, out var resultadoCacheado))
{
contexto.Result = (IActionResult)resultadoCacheado;
}
}
}
}
Exemplo de Controlador Utilizando o Filtro
Em seguida, aplicamos o atributo de filtro a uma ação do controlador. Quando a ação é executada, o resultado é armazenado no cache após a primeira execução.
using Microsoft.AspNetCore.Mvc;
namespace ControladoresExemplo
{
public class ArtigoController : Controller
{
[AtributoCacheFiltro]
public IActionResult Detalhes()
{
ViewBag.HorarioGerado = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
return View();
}
}
}
Visualização Associada
A visualziação exibe os horários de geração do controlador e da própria view, permitindo observar o comportamento do cache.
<h1>Horário do controlador: @ViewBag.HorarioGerado</h1>
<h1>Horário da visualização: @DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")</h1>
Ao realizar múltiplas requisições para a rota /Artigo/Detalhes, nas chamadas subsequentes, o método OnResourceExecuting identifica o resultado cacheado e o retorna diretamente, ignorando a execução do controlador. Assim, o valor de ViewBag.HorarioGerado permanece inalterado, demonstrando que o cache está funcionando. Esta abordagem é útil para páginas com conteúdo que não muda frequentemente, evitando consultas desnecessárias ao banco de dados e otimizando a eficiência da aplicação.