0Pricing
C# Academy · レッスン

レート制限ミドルウェアの設定

エンドポイントやポリシーごとにレート制限を適用します。

「レート制限ミドルウェアの設定」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

AddRateLimiter

構成は、サービスコンテナーで AddRateLimiter を呼び出すことから始まります。1 つ以上の名前付きポリシーと、任意のグローバル拒否ステータスコードを定義します。

builder.Services.AddRateLimiter(options =>
{
    options.RejectionStatusCode =
        StatusCodes.Status429TooManyRequests;
});

固定ウィンドウポリシー

AddFixedWindowLimiter で名前付きポリシーを登録します。許可数の上限、ウィンドウの長さ、キューの動作を設定します。

options.AddFixedWindowLimiter("fixed", limiter =>
{
    limiter.PermitLimit = 100;
    limiter.Window = TimeSpan.FromMinutes(1);
    limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    limiter.QueueLimit = 0;
});

スライディングウィンドウポリシー

AddSlidingWindowLimiter では、平滑化の粒度を制御する SegmentsPerWindow も設定します。

options.AddSlidingWindowLimiter("sliding", limiter =>
{
    limiter.PermitLimit = 100;
    limiter.Window = TimeSpan.FromMinutes(1);
    limiter.SegmentsPerWindow = 6;
    limiter.QueueLimit = 0;
});

トークンバケットポリシー

AddTokenBucketLimiter でバケットサイズと補充レートを設定します。

options.AddTokenBucketLimiter("token", limiter =>
{
    limiter.TokenLimit = 100;
    limiter.TokensPerPeriod = 20;
    limiter.ReplenishmentPeriod = TimeSpan.FromSeconds(10);
    limiter.QueueLimit = 0;
});

同時実行数ポリシー

AddConcurrencyLimiter で同時に処理するリクエスト数に上限を設けます。

options.AddConcurrencyLimiter("concurrent", limiter =>
{
    limiter.PermitLimit = 5;
    limiter.QueueLimit = 10;
    limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
});

ミドルウェアの追加

UseRateLimiter を使ってパイプラインでレート制限を有効にします。ルーティングの後の早い段階に配置します。

var app = builder.Build();

app.UseRateLimiter();

app.MapControllers();

RequireRateLimiting

RequireRateLimiting(Minimal API)または [EnableRateLimiting] 属性(コントローラー)を使って、名前付きポリシーをエンドポイントに適用します。

app.MapGet("/search", () => Results.Ok())
   .RequireRateLimiting("token");

// Controller equivalent:
// [EnableRateLimiting("token")]

特定のエンドポイントで無効にする

DisableRateLimiting または [DisableRateLimiting] を使って、エンドポイントをグループまたはグローバルのリミッターから除外します。

app.MapGet("/health", () => Results.Ok())
   .DisableRateLimiting();

パーティションを使ったグローバルリミッター

GlobalLimiter はすべてのリクエストに適用されます。PartitionedRateLimiter.Create を使うと、ユーザーまたは IP ごとに独自のカウンターを割り当てられます。

options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(
    context =>
    {
        var key = context.User.Identity?.Name
                  ?? context.Connection.RemoteIpAddress?.ToString()
                  ?? "anon";
        return RateLimitPartition.GetFixedWindowLimiter(key, _ =>
            new FixedWindowRateLimiterOptions
            {
                PermitLimit = 100,
                Window = TimeSpan.FromMinutes(1)
            });
    });

拒否時の処理をカスタマイズする

OnRejected を使うと、リクエストが制限されたときに Retry-After ヘッダーや分かりやすい本文を追加できます。

options.OnRejected = async (context, token) =>
{
    if (context.Lease.TryGetMetadata(
            MetadataName.RetryAfter, out var retry))
        context.HttpContext.Response.Headers.RetryAfter =
            ((int)retry.TotalSeconds).ToString();
    await context.HttpContext.Response
        .WriteAsync("Rate limit exceeded.", token);
};

ルートグループに適用する

ポリシーをルートグループ全体に関連付けると、その中のすべてのエンドポイントで制限を共有できます。

var api = app.MapGroup("/api")
             .RequireRateLimiting("fixed");

api.MapGet("/products", () => Results.Ok());
api.MapGet("/orders", () => Results.Ok());

確認問題

ミドルウェアの設定を確認します。

まとめ

レート制限を構成しました。

  • AddRateLimiter で固定ウィンドウ、スライディングウィンドウ、トークンバケット、同時実行数の各ポリシーを定義します。
  • UseRateLimiter でミドルウェアを有効にし、RequireRateLimiting でポリシーを適用します。
  • PartitionedRateLimiter と組み合わせた GlobalLimiter で、クライアントごとのカウンターを設定します。
  • OnRejected で 429 レスポンスをカスタマイズします。

次は、出力キャッシュです。

よくある質問

「レート制限ミドルウェアの設定」レッスンは無料ですか?

はい。「レート制限ミドルウェアの設定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「レート制限ミドルウェアの設定」で何を学びますか?

エンドポイントやポリシーごとにレート制限を適用します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「レート制限ミドルウェアの設定」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. レート制限アルゴリズム
  2. レート制限ミドルウェアの設定
  3. 出力キャッシュの基本
  4. キャッシュポリシーと無効化
← C# Academyに戻る