レート制限ミドルウェアの設定
エンドポイントやポリシーごとにレート制限を適用します。
「レート制限ミドルウェアの設定」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- レート制限アルゴリズム
- レート制限ミドルウェアの設定
- 出力キャッシュの基本
- キャッシュポリシーと無効化