Implementação de Cache com IResourceFilter em ASP.NET Core

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.

Tags: ASP.NET Core IResourceFilter cache MVC C#

Publicado em 7-27 20:29