0Pricing
C# Academy · บทเรียน

การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา

ใช้ขีดจำกัดอัตราต่อจุดเชื่อมต่อและนโยบาย

การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

AddRateLimiter

เริ่มการกำหนดค่าด้วย AddRateLimiter ในคอนเทนเนอร์บริการ คุณกำหนด นโยบายที่มีชื่อได้อย่างน้อยหนึ่งรายการ รวมถึงรหัสสถานะเมื่อปฏิเสธแบบโกลบอลที่เป็นตัวเลือกเสริม

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 ใช้นโยบาย
  • GlobalLimiter ร่วมกับ PartitionedRateLimiter ทำให้มีตัวนับแยกตามไคลเอ็นต์
  • OnRejected ใช้ปรับแต่งการตอบกลับ 429

ถัดไป: การแคชผลลัพธ์

คำถามที่พบบ่อย

บทเรียน “การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา”

ใช้ขีดจำกัดอัตราต่อจุดเชื่อมต่อและนโยบาย คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อัลกอริทึมจำกัดอัตรา
  2. การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา
  3. พื้นฐานการแคชผลลัพธ์
  4. นโยบายแคชและการทำให้แคชใช้ไม่ได้
← กลับไปที่ C# Academy