0Pricing
C# Academy · درس

تهيئة Middleware تحديد معدل الطلبات

طبّقوا حدود المعدل لكل نقطة نهاية وسياسة

تهيئة Middleware تحديد معدل الطلبات درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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;
});

إضافة middleware

فعّل تحديد معدل الطلبات في مسار المعالجة باستخدام 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());

تحقق سريع

تأكد من إعداد middleware.

مراجعة

لقد ضبطت تحديد معدل الطلبات:

  • يعرّف AddRateLimiter سياسات النافذة الثابتة والنافذة المنزلقة ودلو الرموز والتزامن.
  • يفعّل UseRateLimiter middleware، بينما يطبّق RequireRateLimiting سياسة.
  • يوفر GlobalLimiter مع PartitionedRateLimiter عدادات خاصة بكل عميل.
  • يخصص OnRejected استجابة 429.

التالي: التخزين المؤقت للمخرجات.

الأسئلة الشائعة

هل درس «تهيئة Middleware تحديد معدل الطلبات» مجاني؟

نعم — نص درس «تهيئة Middleware تحديد معدل الطلبات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «تهيئة Middleware تحديد معدل الطلبات»؟

طبّقوا حدود المعدل لكل نقطة نهاية وسياسة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تهيئة Middleware تحديد معدل الطلبات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. خوارزميات تحديد معدل الطلبات
  2. تهيئة Middleware تحديد معدل الطلبات
  3. أساسيات التخزين المؤقت للمخرجات
  4. سياسات التخزين المؤقت وإبطالها
← العودة إلى C# Academy