Novidades do .NET 7: Output Caching middleware em APIs REST no ASP.NET Core

Renato Groffe
4 min readAug 1, 2022

--

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):

Clique nesta imagem para visualizar com uma melhor resolução

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:

Clique nesta imagem para visualizar com uma melhor resolução

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:

Clique nesta imagem para visualizar com uma melhor resolução

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:

Clique nesta imagem para visualizar com uma melhor resolução

Já o endpoint /HorarioAtual/cache procederá com o armazenamento em cache por 5 segundos:

Clique nesta imagem para visualizar com uma melhor resolução

Finalmente com o endpoint /HorarioAtual/cachequerystring temos o armazenamento em cache vinculado ao uso de Query Strings (com o parâmetro valorTeste):

Clique nesta imagem para visualizar com uma melhor resolução

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:

https://bit.ly/live-backend-dotnet-ago-2022

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

No responses yet