Novidades do .NET 7: implementando Rate Limit com FixedWindowRateLimiter

Renato Groffe
3 min readMar 27, 2023

Um middleware nativo para implementação de rate limiting está entre as principais novidades trazidas pelo .NET 7 no desenvolvimento com ASP.NET Core. Contando com diferentes possibilidades de configuração, as opções oferecidas por este novo conjunto de funcionalidades estão agrupadas como extensões na classe RateLimiterOptionsExtensions (namespace Microsoft.AspNetCore.RateLimiting).

Entre as alternativas disponíveis para implementação de rate limiting temos:

  • Fixed window
  • Sliding window
  • Token bucket
  • Concurrency

E aproveito este espaço para um convite…

Semana que vem teremos um novo evento ONLINE e GRATUITO do Canal .NET, em que serão apresentadas as principais novidades que integram o .NET 7 e com exemplos de implementação já utilizando o C# 11 e o ASP.NET Core.

Quando: 05/04/2023 (quarta) a partir das 21:00 — horário de Brasília

Faça sua inscrição em:
https://bit.ly/live-dotnet7-novidades

Neste primeiro artigo demonstrarei o uso de rate limiting com o modo Fixed window. Pretendo também cobrir as demais opções em posts futuros aqui no blog.

Ao optarmos pelo modo Fixed Window nas configurações de Rate Limiting teremos o seguinte comportamento:

  • Requisições serão enviadas a uma API, respeitando-se um limite de quantidade (3 no exemplo da animação a seguir, com testes empregando a extensão Thunder Client no Visual Studio Code);
  • Ao atingir o limite um erro será retornado, que neste caso foi baseado no status code 429 (Too Many Requests). Por default o novo middleware retornaria o erro 503 (Service Unavailable), muito embora a prática mais comum seja trabalhar o código 429 (característica essa configurável);
  • Após uma janela de espera (de 5 segundos neste caso), novas requisições poderão ser enviadas à API.
Clique nesta imagem para visualizar com uma melhor resolução

Ajustes deverão ser realizados em Program.cs:

  • Os recursos para Rate Limiting estão no namespace Microsoft.AspNetCore.RateLimiting;
  • Uma chamada ao método AddRateLimiter (a partir da linha 5) permitirá configurar o status code retornado (429 na propriedade RejectionStatusCode), assim como o tipo de Policy para Rate Limiting (Fixed Window com o método AddFixedWindowLimiter, em que um limite de 3 requisições e um tempo/janela de espera de 5 segundos foi especificado). A Policy configurada será identificada pelo nome fixed;
  • O middleware de Rate Limiting será ativado ao invocar o método UseRateLimiter (linha 24).

Podemos vincular o comportamento especificado para a Policy fixed a um Controller ou até a uma Action, com isto acontecendo por meio do uso do atributo EnableRateLimiting. No exemplo a seguir tal atributo foi associado à declaração do tipo ContadorController (implementação de uma API para contagem de acessos):

Este exemplo foi disponibilizado no seguinte repositório do GitHub:

https://github.com/renatogroffe/ASPNETCore7-WebApi-RateLimitingFixedWindow-StatusCode429_ContagemAcessos

Caso achem útil esta solução, peço por favor um ⭐️ nos repositórios apoiando. Fica também o convite para que vocês me sigam lá no GitHub!

Há a possibilidade de também implementarmos este comportamento para Minimal APIs (como indicado no exemplo do repositório a seguir), algo que abordarei em um artigo futuro:

https://github.com/renatogroffe/ASPNETCore7-REST_API-RateLimitingFixedWindow-StatusCode429_ContagemAcessos

--

--

Renato Groffe

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