ConcurrencyLimiter ミドルウェアが削除されました

Microsoft.AspNetCore.ConcurrencyLimiter パッケージとそのミドルウェアは、ASP.NET Core 11 から削除されました。 ミドルウェアは、レート制限ミドルウェア (Microsoft.AspNetCore.RateLimiting) を優先して、ASP.NET Core 8 では古い形式としてマークされています。これにより、System.Threading.RateLimiting を介して同等のコンカレンシー制限機能が公開されます。

導入されたバージョン

.NET 11 Preview 1

以前の動作

以前は、Microsoft.AspNetCore.ConcurrencyLimiter NuGet パッケージをインストールし、UseConcurrencyLimiter 拡張メソッドをキュー ポリシー (AddQueuePolicy または AddStackPolicy) と共に使用して、同時に実行できる要求の数をバインドできました。

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();

ミドルウェアからビルド警告が生成され、レート制限ミドルウェアに誘導されましたが、実行時には引き続き機能します。

新しい動作

ASP.NET Core 11 以降では、Microsoft.AspNetCore.ConcurrencyLimiter ミドルウェア ソースが ASP.NET Core リポジトリから削除され、Microsoft.AspNetCore.ConcurrencyLimiter 11.x 以降のパッケージは発行されません。 次の種類とメソッドは、 net11.0を対象とするアプリでは使用できなくなりました。

  • 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 ( AddQueuePolicyAddStackPolicyを含む)

既存の 9.x および 10.x パッケージ バージョンは NuGet に残り、 net9.0 または net10.0をターゲットとするプロジェクトでも引き続き動作します。 明示的な PackageReference を受け取り、 net11.0 に再ターゲットするプロジェクトでは、11.x パッケージ バージョンがないため、NuGet 復元エラーが発生します。 これらの型を参照するコードは、ASP.NET Core 11 に対してコンパイルに失敗します。

破壊的変更の種類

この変更は、 バイナリの互換性ソースの互換性に影響する可能性があります。

変更の理由

ConcurrencyLimiter ミドルウェアは、ASP.NET Core 8 (診断ASP0025) で廃止されました。これは、より汎用の System.Threading.RateLimiting API に基づいて構築されたレート制限ミドルウェアによって機能がカバーされているためです。 2 つの並列実装を維持すると、メリットのない摩擦が増します。 詳細については、 dotnet/aspnetcore#64020 を参照してください。

レート制限ミドルウェアに移行します。このミドルウェアには、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();

すぐに移行できない場合は、Microsoft.AspNetCore.ConcurrencyLimiter 9.x または 10.x NuGet パッケージnet11.0 をターゲットにしたままにできます。 パッケージの新しいバージョンは、.NET 11 以降に出荷されません。

影響を受ける API

  • 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