التقارير شائعة جدًا في أي نظام ويمكن أن يكون بعضها ثقيلًا جدًا. لذلك ، في هذه الحالة ، قد يتحلل التطبيق أثناء توليد التقرير ، مما يؤثر على المستخدمين الآخرين. ولكن ، كيف يمكننا تجنب هذا؟ الفكر الأول هو منع القاع ، أليس كذلك؟ UM ، ولكن من السهل جدًا الاختراق ، يمكن للمستخدم فقط تحرير الدعائم HTML وتمكينه مرة أخرى. لذلك ، فإن الخيار الأفضل هو حظره على جانب الخادم ، باستخدام بعض استراتيجية التحكم في حد الطلب.
AspNetCoreRateLimit هي مكتبة يمكن أن تساعدنا في التحكم في الطلب. يمكنك تحديد القواعد لتحديد عدد المرات التي يمكن للعميل استدعاء المورد على مدار فترة زمنية.
لكن كيف يعمل؟
يستخدم AspNetCortElimit حل MemoryCache لحفظ المعلومات حول طلبات العميل. على سبيل المثال ، يمكن للعميل تقديم 10 طلبات فقط في فاصل مدته 5 ثوان لنقطة نهاية محددة. وبالتالي ، سيتم حفظ كل طلب في ذاكرة التخزين المؤقت للذاكرة وإذا تجاوز العميل هذا الحد ، فسيقوم التطبيق بإيقاف الطلب وإرجاع حالة خطأ HTTP.
بادئ ذي بدء ، نحتاج إلى تثبيت مكتبة ASPNETCortElimit
أفضل خيار لتكوين ASPNETCortElimit هو تحديد جميع المعلومات داخل AppSettings.json. لذلك ، سنقوم بإنشاء كتلة مثل هذا:
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"GeneralRules": [
{
"Endpoint": "*/api/test",
"Period": "2s", //interval
"Limit": 2 //limit of request in the interval
}
]
},
من خلال تكوين قواعدنا ، نحتاج إلى إضافة أسطر قليلة في Startup.cs :
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
//AspNetCoreRateLimit uses MemoryCache to control the numbers of requests
services.AddMemoryCache();
//Adding AspNetCoreRateLimit rules
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//Adding the store
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
//Adding the request counter
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddHttpContextAccessor();
services.AddControllers();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "RequestLimit", Version = "v1" });
});
}
والخطوة الأخيرة هي تنشيط الخدمة:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "RequestLimit v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseIpRateLimiting() //Adding this block;
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
وقد تم ذلك ، والآن لدى API التحكم في الطلب. يمكنك تخصيص تكوينك لمتابعة قواعد التفاصيل ، يتم سرد جميع الخيارات هنا: https://github.com/stefanprodan/aspnetcortelimit