Novidades do .NET 7: Output Caching middleware em APIs REST no ASP.NET Core
A Microsoft liberou durante o mês de Julho/2022 o Preview 6 do .NET 7, com inúmeras novidades e melhorias também envolvendo o ASP.NET Core:
Neste artigo dou continuidade à série de novas funcionalidades trazidas pelo .NET 7, abordando agora um recurso disponibilizado com o Preview 6 e voltado ao desenvolvimento de APIs REST: um middleware para Output Caching.
Esta nova opção permite que configuremos o armazenamento em cache do retorno produzido por endpoints/Actions em APIs REST construídas com o ASP.NET Core, independente da escolha de Minimal APIs ou Web APIs como opções de desenvolvimento. Para testar o uso de Output Caching tomei como base o tipo Resultado, em que constarão o horário atual e uma mensagem que descreve o tipo de operação que estamos validando:
Na listagem seguinte temos a implementação de 3 endpoints empregando Minimal APIs:
- Para ativar a utilização de caching precisamos acionar os métodos AddOutputCache (linha 17) e UseOutputCache (linha 59);
- No caso específico de AddOutputCache, defini ainda um período default de 5 segundos para o cache (linha 19);
- O método CacheOutput permite configurar o uso do mecanismo de caching para os endpoints /cache (linha 42) e /cachequerystring (a partir da linha 53);
- Nas configurações de CacheOutput para o endpoint /cachequerystring foram também realizados ajustes adicionais. O método VaryByQuery (linha 55) permite indicar qual parâmetro numa query string deverá ser considerado para efeitos de cache, já em Expire (linha 56) redefinimos o tempo de cache para 15 segundos (sobrepondo o comportamento default de 5 segundos).
Esse exemplo com Minimal APIs já está disponível no GitHub:
https://github.com/renatogroffe/ASPNETCore7-Preview6-MinimalAPIs-CacheOutput_HorarioAtual
Caso achem útil a solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá!
Na animação a seguir temos exemplos de uso do endpoint (/nocache) em que não houve o armazenamento em cache das respostas (os testes foram executados através da utilização da extensão Thunder Client, um complemento gratuito para o Visual Studio Code):
Já a próxima imagem demonstra o uso do endpoint (/cache) em que um cache de 5 segundos foi habilitado. Novas mensagens de logging aparecem no Terminal apenas quando houver a expiração do cache:
Temos ainda testes com o endpoint no qual se configurou o cache variando conforme a query string informada (/cachequerystring). Os resultados serão então cacheados conforme cada variação do parâmetro valorTeste:
Em projetos baseados em Web APIs também precisaremos acionar os métodos AddOutputCache (linha 17) e UseOutputCache (linha 30) em Program.cs:
Já em Controllers deveremos utilizar o novo atributo OutputCache (namespace Microsoft.AspNetCore.OutputCaching). É o que podemos observar na implementação do tipo HorarioAtualController:
- A propriedade Duration indica o tempo em segundos correspondente à validade do cache. É o caso dos métodos GetCache (linha 27) e GetCacheQueryString (linha 36);
- Temos ainda a possibilidade de indicar que o armazenamento está atrelado a Query Strings ou Headers, através das propriedades VaryByQueryKeys e VaryByHeaders. No método GetCacheQueryString (linha 36) especifiquei que o cache está atrelado ao uso do parâmetro valorTeste em Query Strings.
Esse segundo exemplo baseado em Web APIs também está disponível no GitHub:
https://github.com/renatogroffe/ASPNETCore7-Preview6-REST_API-CacheOutput_HorarioAtual
Caso também achem útil esta segunda solução, peço novamente por favor um ⭐️ no repositório apoiando. Fica também o convite para que me sigam lá no GitHub!
Acessando o endpoint /HorarioAtual/nocache teremos os resultados produzidos pela Action que não emprega técnicas de caching:
Já o endpoint /HorarioAtual/cache procederá com o armazenamento em cache por 5 segundos:
Finalmente com o endpoint /HorarioAtual/cachequerystring temos o armazenamento em cache vinculado ao uso de Query Strings (com o parâmetro valorTeste):
E finalizo este post com um convite…
Segunda 15/08 às 21:00 — horário de Brasília — teremos mais um evento online e gratuito no canal Canal .NET.
Esta nova live trará dicas, truques e alternativas úteis para o desenvolvimento Back-End e de APIs REST com .NET 6, C#, ASP.NET Core e Azure Functions. Ao longo da apresentação será coberto o uso de diferentes frameworks, serviços na nuvem, mensageria e boas práticas de forma a facilitar e tornar mais dinâmica a implementação de soluções baseadas na plataforma .NET no seu dia a dia.
Teremos também algumas novidades do Visual Studio 2022, .NET 7 e do C# 11 demonstradas na prática!
Para participar faça sua inscrição no link a seguir, a transmissão acontecerá via YouTube: