खोज…


टिप्पणियों

AspNetCoreRateLimit एक ओपन सोर्स ASP.NET कोर रेट लिमिटिंग सॉल्यूशन है जिसे आईपी एड्रेस या क्लाइंट आईडी के आधार पर क्लाइंट एक वेब एपीआई या एमवीसी ऐप के लिए कर सकते हैं।

क्लाइंट आईपी पर आधारित दर सीमित करना

IpRateLimit मिडलवेयर के साथ आप अलग-अलग परिदृश्यों के लिए कई सीमाएँ निर्धारित कर सकते हैं जैसे कि IP या IP श्रेणी को समय अंतराल में अधिकतम कॉल करने की अनुमति देना जैसे कि प्रति सेकंड, 15 मिनट, आदि। आप किए गए सभी अनुरोधों को संबोधित करने के लिए इन सीमाओं को परिभाषित कर सकते हैं। एपीआई या आप प्रत्येक URL पथ या HTTP क्रिया और पथ की सीमाओं को सीमित कर सकते हैं।

सेट अप

NuGet इंस्टॉल करें :

Install-Package AspNetCoreRateLimit

Startup.cs कोड :

public void ConfigureServices(IServiceCollection services)
{
    // needed to load configuration from appsettings.json
    services.AddOptions();

    // needed to store rate limit counters and ip rules
    services.AddMemoryCache();

    //load general configuration from appsettings.json
    services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));

    //load ip rules from appsettings.json
    services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));

    // inject counter and rules stores
    services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
    services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

    // Add framework services.
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseIpRateLimiting();

    app.UseMvc();
}

आपको लॉगगरफैक्टरी को छोड़कर किसी अन्य घटक से पहले मिडलवेयर को पंजीकृत करना चाहिए।

यदि आप अपने ऐप को बैलेंस करते हैं तो आपको Redis या SQLServer के साथ IDistributedCache का उपयोग करना होगा ताकि सभी केस्ट्रल इंस्टेंसेस में समान दर सीमा स्टोर हो। मेमोरी स्टोर के बजाय आपको वितरित स्टोर को इस तरह इंजेक्ट करना चाहिए:

    // inject counter and rules distributed cache stores
    services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>();
    services.AddSingleton<IRateLimitCounterStore,DistributedCacheRateLimitCounterStore>();

कॉन्फ़िगरेशन और सामान्य नियम appsettings.json :

  "IpRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
    "EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],
    "ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "1s",
        "Limit": 2
      },
      {
        "Endpoint": "*",
        "Period": "15m",
        "Limit": 100
      },
      {
        "Endpoint": "*",
        "Period": "12h",
        "Limit": 1000
      },
      {
        "Endpoint": "*",
        "Period": "7d",
        "Limit": 10000
      }
    ]
  }

यदि EnableEndpointRateLimiting false सेट है, तो सीमाएँ विश्व स्तर पर लागू होंगी और केवल समापन बिंदु * नियम लागू होंगे। उदाहरण के लिए यदि आप प्रति सेकंड 5 कॉल की सीमा निर्धारित करते हैं, तो किसी भी एंडपॉइंट पर कोई भी HTTP कॉल उस सीमा की ओर गिना जाएगा।

यदि EnableEndpointRateLimiting true सेट true तो सीमाएं प्रत्येक समापन बिंदु के लिए {HTTP_Verb}{PATH} लागू {HTTP_Verb}{PATH} । उदाहरण के लिए यदि आप प्रति सेकंड 5 कॉल की सीमा निर्धारित करते हैं *:/api/values एक ग्राहक GET /api/values प्रति सेकंड 5 बार कॉल कर सकते हैं, लेकिन 5 बार PUT /api/values

यदि StackBlockedRequests को false अस्वीकृत कॉल पर सेट किया गया है तो थ्रॉटल काउंटर में नहीं जोड़ा जाता है। यदि कोई ग्राहक प्रति सेकंड 3 अनुरोध करता है और आपने प्रति सेकंड एक कॉल की सीमा निर्धारित की है, तो प्रति मिनट या प्रति दिन काउंटर जैसी अन्य सीमाएं केवल पहली कॉल रिकॉर्ड करेंगी, वह जो अवरुद्ध नहीं थी। यदि आप अन्य सीमाओं की ओर गिनने के लिए अस्वीकृत अनुरोध चाहते हैं, तो आपको StackBlockedRequests को true पर सेट StackBlockedRequests होगा।

RealIpHeader का उपयोग क्लाइंट IP को निकालने के लिए किया जाता है जब आपका Kestrel सर्वर एक रिवर्स प्रॉक्सी के पीछे होता है, यदि आपका प्रॉक्सी एक अलग हेडर का उपयोग करता है तो इसे सेट करने के लिए X-Real-IP इस विकल्प का उपयोग करें।

ClientIdHeader का उपयोग सफेद सूचीकरण के लिए क्लाइंट आईडी को निकालने के लिए किया जाता है, यदि कोई क्लाइंट आईडी इस हेडर में मौजूद है और क्लाइंटव्हीटलिस्ट में निर्दिष्ट मान से मेल खाता है तो कोई दर सीमा लागू नहीं होती है।

विशिष्ट IP appsettings.json के लिए सामान्य नियम को ओवरराइड करें :

 "IpRateLimitPolicies": {
    "IpRules": [
      {
        "Ip": "84.247.85.224",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "1s",
            "Limit": 10
          },
          {
            "Endpoint": "*",
            "Period": "15m",
            "Limit": 200
          }
        ]
      },
      {
        "Ip": "192.168.3.22/25",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "1s",
            "Limit": 5
          },
          {
            "Endpoint": "*",
            "Period": "15m",
            "Limit": 150
          },
          {
            "Endpoint": "*",
            "Period": "12h",
            "Limit": 500
          }
        ]
      }
    ]
  }

IP फ़ील्ड IP v4 और v6 मानों और "192.168.0.0/24", "fe80 :: / 10" या "192.168.0.0-192.168.0.255" जैसी श्रेणियों का समर्थन करता है।

दर सीमा नियमों को परिभाषित करना

एक नियम एक समापन बिंदु, एक अवधि और एक सीमा से बना है।

समापन बिंदु प्रारूप {HTTP_Verb}:{PATH} , आप किसी भी HTTP क्रिया को एस्टेरिक्स प्रतीक का उपयोग करके लक्षित कर सकते हैं।

अवधि प्रारूप {INT}{PERIOD_TYPE} , आप निम्न अवधि प्रकारों में से एक का उपयोग कर सकते हैं: s, m, h, d

सीमा प्रारूप {LONG}

उदाहरण :

प्रति सेकंड 2 कॉल के लिए सभी समापन बिंदुओं को सीमित करें:

{
 "Endpoint": "*",
 "Period": "1s",
 "Limit": 2
}

यदि, एक ही IP से, एक ही सेकंड में, आप एपीआई / मानों के लिए 3 GET कॉल करेंगे, तो अंतिम कॉल अवरुद्ध हो जाएगी। लेकिन अगर एक ही सेकंड में आप PUT api / वैल्यूज भी कहते हैं, तो रिक्वेस्ट से गुजरना होगा क्योंकि यह एक अलग एंडपॉइंट है। जब एंडपॉइंट दर सीमित होती है तो प्रत्येक कॉल {HTTP_Verb}{PATH} आधार पर सीमित होती है।

किसी भी HTTP Verb /api/values साथ कॉल की दर सीमा 15 मिनट प्रति 5 कॉल:

{
 "Endpoint": "*:/api/values",
 "Period": "15m",
 "Limit": 5
}

प्रति घंटे 5 कॉल करने के लिए /api/values लिए दर सीमा प्राप्त करें:

{
 "Endpoint": "get:/api/values",
 "Period": "1h",
 "Limit": 5
}

यदि, एक ही IP से, एक घंटे में, आप एपीआई / मानों को 6 GET कॉल करेंगे, तो अंतिम कॉल अवरुद्ध हो जाएगी। लेकिन अगर एक ही घंटे में आप जीईटी एपीआई / मान / 1 भी कॉल करते हैं, तो अनुरोध इसलिए होगा क्योंकि यह एक अलग समापन बिंदु है।

व्यवहार

जब कोई क्लाइंट HTTP कॉल करता है तो IpRateLimitMiddleware निम्नलिखित कार्य करता है:

  • IP, क्लाइंट आईडी, HTTP क्रिया और URL को अनुरोध ऑब्जेक्ट से निकालता है, यदि आप अपने स्वयं के निष्कर्षण तर्क को लागू करना चाहते हैं तो आप IpRateLimitMiddleware.SetIdentity को ओवरराइड कर सकते हैं
  • सफेद सूचियों में आईपी, क्लाइंट आईडी और URL की खोज करता है, यदि कोई मेल खाता है तो कोई कार्रवाई नहीं की जाती है
  • एक मैच के लिए आईपी नियमों में खोज, लागू होने वाले सभी नियमों को अवधि के अनुसार समूहीकृत किया जाता है, प्रत्येक अवधि के लिए सबसे अधिक प्रतिबंधात्मक नियम का उपयोग किया जाता है
  • एक मैच के लिए सामान्य नियमों में खोज, यदि एक सामान्य नियम जिसमें मैचों की एक निर्धारित अवधि है जो आईपी नियमों में मौजूद नहीं है तो इस सामान्य नियम का भी उपयोग किया जाता है
  • प्रत्येक मिलान नियम के लिए दर सीमा काउंटर बढ़ा हुआ है, यदि काउंटर मान अधिक है तो नियम सीमा तब अनुरोध अवरुद्ध हो जाता है

यदि अनुरोध अवरुद्ध हो जाता है तो ग्राहक को इस तरह एक पाठ प्रतिक्रिया मिलती है:

Status Code: 429
Retry-After: 58
Content: API calls quota exceeded! maximum admitted 2 per 1m.

आप इन विकल्पों HttpStatusCode और QuotaExceededMessage को बदलकर प्रतिक्रिया को अनुकूलित कर सकते हैं, यदि आप अपनी खुद की प्रतिक्रिया को लागू करना चाहते हैं तो आप IpRateLimitMiddleware.ReturnQuotaExceededResponse को ओवरराइड कर सकते हैं। Retry-After हेडर मूल्य सेकंडों में व्यक्त किया जाता है।

यदि अनुरोध को दर सीमित नहीं मिलती है, तो मिलान नियमों में परिभाषित सबसे लंबी अवधि का उपयोग एक्स-रेट-लिमिट हेडर बनाने के लिए किया जाता है, इन हेडरों को प्रतिक्रिया में इंजेक्ट किया जाता है:

X-Rate-Limit-Limit: the rate limit period (eg. 1m, 12h, 1d)
X-Rate-Limit-Remaining: number of request remaining 
X-Rate-Limit-Reset: UTC date time when the limits resets

डिफ़ॉल्ट रूप से अवरुद्ध अनुरोध Microsoft.Extensions.Logging.ILogger का उपयोग करके लॉग किया जाता है, यदि आप अपने स्वयं के लॉगिंग को लागू करना चाहते हैं तो आप IpRateLimitMiddleware.LogBlockedRequest को ओवरराइड कर सकते हैं। डिफ़ॉल्ट लकड़हारा निम्नलिखित जानकारी का अनुरोध करता है जब अनुरोध सीमित हो जाता है:

info: AspNetCoreRateLimit.IpRateLimitMiddleware[0]
      Request get:/api/values from IP 84.247.85.224 has been blocked, quota 2/1m exceeded by 3. Blocked by rule *:/api/value, TraceIdentifier 0HKTLISQQVV9D.

अद्यतन दर सीमा रनटाइम पर

एप्लिकेशन स्टार्टअप पर appsettings.json में परिभाषित IP दर सीमा नियम या तो MemoryCacheClientPolicyStore में लोड किए जाते हैं या तो MemoryCacheClientPolicyStore या DistributedCacheIpPolicyStore पर निर्भर करता है कि आप किस प्रकार के कैश प्रदाता का उपयोग कर रहे हैं। आप एक नियंत्रक के अंदर आईपी पॉलिसी स्टोर तक पहुंच सकते हैं और आईपी नियमों को संशोधित कर सकते हैं:

public class IpRateLimitController : Controller
{
    private readonly IpRateLimitOptions _options;
    private readonly IIpPolicyStore _ipPolicyStore;

    public IpRateLimitController(IOptions<IpRateLimitOptions> optionsAccessor, IIpPolicyStore ipPolicyStore)
    {
        _options = optionsAccessor.Value;
        _ipPolicyStore = ipPolicyStore;
    }

    [HttpGet]
    public IpRateLimitPolicies Get()
    {
        return _ipPolicyStore.Get(_options.IpPolicyPrefix);
    }

    [HttpPost]
    public void Post()
    {
        var pol = _ipPolicyStore.Get(_options.IpPolicyPrefix);

        pol.IpRules.Add(new IpRateLimitPolicy
        {
            Ip = "8.8.4.4",
            Rules = new List<RateLimitRule>(new RateLimitRule[] {
                new RateLimitRule {
                    Endpoint = "*:/api/testupdate",
                    Limit = 100,
                    Period = "1d" }
            })
        });

        _ipPolicyStore.Set(_options.IpPolicyPrefix, pol);
    }
}

इस तरह आप एक डेटाबेस में आईपी दर सीमा को स्टोर कर सकते हैं और प्रत्येक ऐप के शुरू होने के बाद उन्हें कैश में धकेल सकते हैं।

क्लाइंट आईडी के आधार पर रेट सीमित करना

ClientRateLimit मिडलवेयर के साथ आप अलग-अलग परिदृश्यों के लिए कई सीमाएँ निर्धारित कर सकते हैं, जैसे क्लाइंट को समय अंतराल में अधिकतम कॉल करने की अनुमति देना जैसे कि प्रति सेकंड, 15 मिनट, आदि। आप किसी API या आपके द्वारा किए गए सभी अनुरोधों को संबोधित करने के लिए इन सीमाओं को परिभाषित कर सकते हैं। प्रत्येक URL पथ या HTTP क्रिया और पथ की सीमाओं को सीमित कर सकता है।

सेट अप

NuGet इंस्टॉल करें :

Install-Package AspNetCoreRateLimit

Startup.cs कोड :

public void ConfigureServices(IServiceCollection services)
{
    // needed to load configuration from appsettings.json
    services.AddOptions();

    // needed to store rate limit counters and ip rules
    services.AddMemoryCache();

    //load general configuration from appsettings.json
    services.Configure<ClientRateLimitOptions>(Configuration.GetSection("ClientRateLimiting"));

    //load client rules from appsettings.json
    services.Configure<ClientRateLimitPolicies>(Configuration.GetSection("ClientRateLimitPolicies"));

    // inject counter and rules stores
    services.AddSingleton<IClientPolicyStore, MemoryCacheClientPolicyStore>();
    services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

    // Add framework services.
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseClientRateLimiting();

    app.UseMvc();
}

आपको लॉगगरफैक्टरी को छोड़कर किसी अन्य घटक से पहले मिडलवेयर को पंजीकृत करना चाहिए।

यदि आप अपने ऐप को बैलेंस करते हैं तो आपको Redis या SQLServer के साथ IDistributedCache का उपयोग करना होगा ताकि सभी केस्ट्रल इंस्टेंसेस में समान दर सीमा स्टोर हो। मेमोरी स्टोर के बजाय आपको वितरित स्टोर को इस तरह इंजेक्ट करना चाहिए:

    // inject counter and rules distributed cache stores
    services.AddSingleton<IClientPolicyStore, DistributedCacheClientPolicyStore>();
    services.AddSingleton<IRateLimitCounterStore,DistributedCacheRateLimitCounterStore>();

कॉन्फ़िगरेशन और सामान्य नियम appsettings.json :

  "ClientRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],
    "ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "1s",
        "Limit": 2
      },
      {
        "Endpoint": "*",
        "Period": "15m",
        "Limit": 100
      },
      {
        "Endpoint": "*",
        "Period": "12h",
        "Limit": 1000
      },
      {
        "Endpoint": "*",
        "Period": "7d",
        "Limit": 10000
      }
    ]
  }

यदि EnableEndpointRateLimiting false सेट है, तो सीमाएँ विश्व स्तर पर लागू होंगी और केवल समापन बिंदु * नियम लागू होंगे। उदाहरण के लिए यदि आप प्रति सेकंड 5 कॉल की सीमा निर्धारित करते हैं, तो किसी भी एंडपॉइंट पर कोई भी HTTP कॉल उस सीमा की ओर गिना जाएगा।

यदि EnableEndpointRateLimiting true सेट true तो सीमाएं प्रत्येक समापन बिंदु के लिए {HTTP_Verb}{PATH} लागू {HTTP_Verb}{PATH} । उदाहरण के लिए यदि आप प्रति सेकंड 5 कॉल की सीमा निर्धारित करते हैं *:/api/values एक ग्राहक GET /api/values प्रति सेकंड 5 बार कॉल कर सकते हैं, लेकिन 5 बार PUT /api/values

यदि StackBlockedRequests को false अस्वीकृत कॉल पर सेट किया गया है तो थ्रॉटल काउंटर में नहीं जोड़ा जाता है। यदि कोई ग्राहक प्रति सेकंड 3 अनुरोध करता है और आपने प्रति सेकंड एक कॉल की सीमा निर्धारित की है, तो प्रति मिनट या प्रति दिन काउंटर जैसी अन्य सीमाएं केवल पहली कॉल रिकॉर्ड करेंगी, वह जो अवरुद्ध नहीं थी। यदि आप अन्य सीमाओं की ओर गिनने के लिए अस्वीकृत अनुरोध चाहते हैं, तो आपको StackBlockedRequests को true पर सेट StackBlockedRequests होगा।

ClientIdHeader का उपयोग क्लाइंट आईडी को निकालने के लिए किया जाता है, यदि कोई क्लाइंट आईडी इस हेडर में मौजूद है और क्लाइंट वॉइटेलिस्ट में निर्दिष्ट मूल्य से मेल खाता है तो कोई दर सीमा लागू नहीं होती है।

विशिष्ट ग्राहकों के लिए सामान्य नियमों को ओवरराइड करें appsettings.json :

 "ClientRateLimitPolicies": {
    "ClientRules": [
      {
        "ClientId": "client-id-1",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "1s",
            "Limit": 10
          },
          {
            "Endpoint": "*",
            "Period": "15m",
            "Limit": 200
          }
        ]
      },
      {
        "Client": "client-id-2",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "1s",
            "Limit": 5
          },
          {
            "Endpoint": "*",
            "Period": "15m",
            "Limit": 150
          },
          {
            "Endpoint": "*",
            "Period": "12h",
            "Limit": 500
          }
        ]
      }
    ]
  }

दर सीमा नियमों को परिभाषित करना

एक नियम एक समापन बिंदु, एक अवधि और एक सीमा से बना है।

समापन बिंदु प्रारूप {HTTP_Verb}:{PATH} , आप किसी भी HTTP क्रिया को एस्टेरिक्स प्रतीक का उपयोग करके लक्षित कर सकते हैं।

अवधि प्रारूप {INT}{PERIOD_TYPE} , आप निम्न अवधि प्रकारों में से एक का उपयोग कर सकते हैं: s, m, h, d

सीमा प्रारूप {LONG}

उदाहरण :

प्रति सेकंड 2 कॉल के लिए सभी समापन बिंदुओं को सीमित करें:

{
 "Endpoint": "*",
 "Period": "1s",
 "Limit": 2
}

यदि एक ही सेकंड में, एक ग्राहक एपीआई / मानों के लिए 3 GET कॉल करता है, तो अंतिम कॉल अवरुद्ध हो जाएगी। लेकिन अगर उसी सेकंड में वह PUT को एपीआई / वैल्यू भी कहता है, तो यह अनुरोध अलग हो जाएगा क्योंकि यह एक अलग समापन बिंदु है। जब एंडपॉइंट दर सीमित होती है तो प्रत्येक कॉल {HTTP_Verb}{PATH} आधार पर सीमित होती है।

किसी भी HTTP Verb /api/values साथ कॉल की दर सीमा 15 मिनट प्रति 5 कॉल:

{
 "Endpoint": "*:/api/values",
 "Period": "15m",
 "Limit": 5
}

प्रति घंटे 5 कॉल करने के लिए /api/values लिए दर सीमा प्राप्त करें:

{
 "Endpoint": "get:/api/values",
 "Period": "1h",
 "Limit": 5
}

यदि एक घंटे में, एक ग्राहक एपीआई / मानों को 6 जीईटी कॉल करता है, तो अंतिम कॉल अवरुद्ध हो जाएगी। लेकिन अगर एक ही घंटे में वह GET एपीआई / वैल्यू / 1 भी कॉल करता है, तो अनुरोध अलग-अलग बिंदुओं के माध्यम से जाएगा।

व्यवहार

जब कोई क्लाइंट HTTP कॉल करता है तो ClientRateLimitMiddleware निम्नलिखित कार्य करता है:

  • क्लाइंट ऑब्जेक्ट, HTTP क्रिया और URL को अनुरोध ऑब्जेक्ट से निकालता है, यदि आप अपने स्वयं के निष्कर्षण तर्क को लागू करना चाहते हैं तो आप ClientRateLimitMiddleware.SetIdentity को ओवरराइड कर सकते हैं
  • सफेद सूचियों में क्लाइंट आईडी और URL की खोज, यदि कोई मेल खाता है तो कोई कार्रवाई नहीं की जाती है
  • एक मैच के लिए क्लाइंट नियमों में खोज, लागू होने वाले सभी नियमों को अवधि के अनुसार समूहीकृत किया जाता है, प्रत्येक अवधि के लिए सबसे अधिक प्रतिबंधात्मक नियम का उपयोग किया जाता है
  • एक मैच के लिए सामान्य नियमों में खोज, यदि एक सामान्य नियम जो मैचों में एक परिभाषित अवधि है जो क्लाइंट नियमों में मौजूद नहीं है तो इस सामान्य नियम का भी उपयोग किया जाता है
  • प्रत्येक मिलान नियम के लिए दर सीमा काउंटर बढ़ा हुआ है, यदि काउंटर मान अधिक है तो नियम सीमा तब अनुरोध अवरुद्ध हो जाता है

यदि अनुरोध अवरुद्ध हो जाता है तो ग्राहक को इस तरह एक पाठ प्रतिक्रिया मिलती है:

Status Code: 429
Retry-After: 58
Content: API calls quota exceeded! maximum admitted 2 per 1m.

आप इन विकल्पों HttpStatusCode और QuotaExceededMessage को बदलकर प्रतिक्रिया को अनुकूलित कर सकते हैं, यदि आप अपनी खुद की प्रतिक्रिया को लागू करना चाहते हैं तो आप ClientRateLimitMiddleware.ReturnQuotaExceededResponse को ओवरराइड कर सकते हैं। Retry-After हेडर मूल्य सेकंडों में व्यक्त किया जाता है।

यदि अनुरोध को दर सीमित नहीं मिलती है, तो मिलान नियमों में परिभाषित सबसे लंबी अवधि का उपयोग एक्स-रेट-लिमिट हेडर बनाने के लिए किया जाता है, इन हेडरों को प्रतिक्रिया में इंजेक्ट किया जाता है:

X-Rate-Limit-Limit: the rate limit period (eg. 1m, 12h, 1d)
X-Rate-Limit-Remaining: number of request remaining 
X-Rate-Limit-Reset: UTC date time when the limits resets

डिफ़ॉल्ट रूप से अवरुद्ध अनुरोध Microsoft.Extensions.Logging.ILogger का उपयोग करके लॉग इन किया जाता है, यदि आप अपने स्वयं के लॉगिंग को लागू करना चाहते हैं तो आप ClientRateLimitMiddleware.LogBlockedRequest को ओवरराइड कर सकते हैं। डिफ़ॉल्ट लकड़हारा निम्नलिखित जानकारी का अनुरोध करता है जब अनुरोध सीमित हो जाता है:

info: AspNetCoreRateLimit.ClientRateLimitMiddleware[0]
      Request get:/api/values from ClientId client-id-1 has been blocked, quota 2/1m exceeded by 3. Blocked by rule *:/api/value, TraceIdentifier 0HKTLISQQVV9D.

अद्यतन दर सीमा रनटाइम पर

एप्लिकेशन स्टार्टअप पर appsettings.json में परिभाषित क्लाइंट रेट लिमिट नियम कैश में लोड किए जाते हैं या तो MemoryCacheClientPolicyStore या DistributedCacheClientPolicyStore MemoryCacheClientPolicyStore पर निर्भर करता है कि आप किस प्रकार के कैश प्रोवाइडर का उपयोग कर रहे हैं। आप एक कंट्रोलर के अंदर क्लाइंट पॉलिसी स्टोर तक पहुँच सकते हैं और नियमों को संशोधित कर सकते हैं जैसे:

public class ClientRateLimitController : Controller
{
    private readonly ClientRateLimitOptions _options;
    private readonly IClientPolicyStore _clientPolicyStore;

    public ClientRateLimitController(IOptions<ClientRateLimitOptions> optionsAccessor, IClientPolicyStore clientPolicyStore)
    {
        _options = optionsAccessor.Value;
        _clientPolicyStore = clientPolicyStore;
    }

    [HttpGet]
    public ClientRateLimitPolicy Get()
    {
        return _clientPolicyStore.Get($"{_options.ClientPolicyPrefix}_cl-key-1");
    }

    [HttpPost]
    public void Post()
    {
        var id = $"{_options.ClientPolicyPrefix}_cl-key-1";
        var clPolicy = _clientPolicyStore.Get(id);
        clPolicy.Rules.Add(new RateLimitRule
        {
            Endpoint = "*/api/testpolicyupdate",
            Period = "1h",
            Limit = 100
        });
        _clientPolicyStore.Set(id, clPolicy);
    }
}

इस तरह आप क्लाइंट रेट लिमिट को डेटाबेस में स्टोर कर सकते हैं और प्रत्येक ऐप के शुरू होने के बाद उन्हें कैश में पुश कर सकते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow