Middleware ConcurrencyLimiter removido

O pacote Microsoft.AspNetCore.ConcurrencyLimiter e o seu middleware foram removidos do ASP.NET Core 11. O middleware foi marcado como obsoleto no ASP.NET Core 8 em favor do middleware de limitação de taxa (Microsoft.AspNetCore.RateLimiting), que expõe a funcionalidade equivalente de limitação de concorrência por meio de System.Threading.RateLimiting.

Versão introduzida

.NET 11 Prévia 1

Comportamento anterior

Anteriormente, podia instalar o pacote NuGet Microsoft.AspNetCore.ConcurrencyLimiter e usar o método de extensão UseConcurrencyLimiter juntamente com uma das políticas de fila (AddQueuePolicy ou AddStackPolicy) para limitar quantos pedidos podiam ser executados simultaneamente:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.ConcurrencyLimiter;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddQueuePolicy(options =>
{
    options.MaxConcurrentRequests = 2;
    options.RequestQueueLimit = 25;
});

var app = builder.Build();

app.UseConcurrencyLimiter();
app.Run(async context => await context.Response.WriteAsync("Hello World!"));
app.Run();

O middleware emitia um aviso de compilação que te direcionava para o middleware limitador de velocidade, mas continuava a funcionar em tempo de execução.

Novo comportamento

A partir de ASP.NET Core 11, a fonte de middleware Microsoft.AspNetCore.ConcurrencyLimiter é removida do repositório ASP.NET Core, e nenhum pacote Microsoft.AspNetCore.ConcurrencyLimiter 11.x ou posterior é publicado. Os seguintes tipos e métodos já não estão disponíveis para aplicações que visam net11.0:

  • Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware
  • Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterOptions
  • Microsoft.AspNetCore.ConcurrencyLimiter.IQueuePolicy
  • Microsoft.AspNetCore.ConcurrencyLimiter.QueuePolicyOptions
  • Microsoft.AspNetCore.Builder.ConcurrencyLimiterExtensions (incluindo o método de extensão UseConcurrencyLimiter)
  • Microsoft.Extensions.DependencyInjection.QueuePolicyServiceCollectionExtensions (incluindo AddQueuePolicy e AddStackPolicy)

As versões existentes dos pacotes 9.x e 10.x permanecem no NuGet e continuam a funcionar para projetos que ainda têm como objetivo net9.0 ou net10.0. Projetos que especificam explicitamente PackageReference e redirecionam para net11.0 geram um erro de restauro de pacotes do NuGet, porque não existe uma versão 11.x do pacote. O código que faz referência a estes tipos falha em compilar contra o ASP.NET Core 11.

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade binária e a compatibilidade de origem.

Motivo da mudança

O middleware ConcurrencyLimiter foi considerado obsoleto em ASP.NET Core 8 (diagnóstico ASP0025) porque a sua funcionalidade é coberta pelo middleware limitador de velocidade, que é construído sobre as APIs mais gerais System.Threading.RateLimiting. Manter duas implementações paralelas acrescenta atrito sem benefício. Para mais informações, consulte dotnet/aspnetcore#64020.

Migre para o middleware de limitação de taxa, que fornece um limitador de concorrência equivalente construído em System.Threading.RateLimiting.ConcurrencyLimiter:

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using System.Threading.RateLimiting;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRateLimiter(options =>
{
    options.AddConcurrencyLimiter("ConcurrencyPolicy", limiterOptions =>
    {
        limiterOptions.PermitLimit = 2;
        limiterOptions.QueueLimit = 25;
        limiterOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    });
});

var app = builder.Build();

app.UseRateLimiter();
app.MapGet("/", () => "Hello World!").RequireRateLimiting("ConcurrencyPolicy");
app.Run();

Se não conseguires migrar imediatamente, podes manter-te num pacote Microsoft.AspNetCore.ConcurrencyLimiter 9.x ou 10.x NuGet enquanto tiveres net11.0 como destino. Nenhuma nova versão do pacote será enviada para .NET 11 ou posteriores.

APIs afetadas

  • Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware
  • Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterOptions
  • Microsoft.AspNetCore.ConcurrencyLimiter.IQueuePolicy
  • Microsoft.AspNetCore.ConcurrencyLimiter.QueuePolicyOptions
  • Microsoft.AspNetCore.Builder.ConcurrencyLimiterExtensions.UseConcurrencyLimiter
  • Microsoft.Extensions.DependencyInjection.QueuePolicyServiceCollectionExtensions.AddQueuePolicy
  • Microsoft.Extensions.DependencyInjection.QueuePolicyServiceCollectionExtensions.AddStackPolicy