A comprehensive demonstration of native ASP.NET Core Rate Limiting capabilities using .NET 9.0.
This project showcases 5 different rate limiting algorithms:
- Fixed Window - Simple time-based limiting
- Sliding Window - Smoother rate limiting with overlapping windows
- Token Bucket - Allows burst traffic with gradual token replenishment
- Concurrency - Limits concurrent requests
- Global Limiter - Fallback rate limiting for all endpoints
- .NET 10.0 SDK
- Visual Studio 2022 (17.8+) or Visual Studio Code
- Optional: Postman or curl for testing
git clone https://github.com/HeberHolanda/RateLimiting-NetCore10
cd RateLimiting-NetCore10dotnet restoredotnet run --project RateLimiting-NetCore6The application will start on https://localhost:5001 (or the port configured in launchSettings.json).
Navigate to: https://localhost:5001/swagger
- Limit: 3 requests per 30 seconds
- Partition: IP Address
- Use Case: Basic IP-based throttling
- Limit: 10 requests per minute
- Partition: Client ID (via
X-ClientIdheader) - Whitelist:
dev-id-1,dev-id-2 - Use Case: Per-client rate limiting
- Limit: 6 requests per minute
- Partition: IP Address + Endpoint
- Segments: 2 per window
- Use Case: Smoother API endpoint limiting
- Tokens: 100 initial, 20 per minute replenishment
- Partition: IP Address
- Use Case: Handle burst traffic gracefully
- Limit: 5 concurrent requests
- Partition: IP Address
- Use Case: Resource-intensive operations
GET /api/IpRateLimit/GetRateLimitInfoTests IP-based rate limiting (IpPolicy).
GET /api/IpRateLimit/TestSlidingWindowTests sliding window algorithm (ApiPolicy).
POST /api/IpRateLimit/TestTokenBucketTests token bucket algorithm.
GET /api/IpRateLimit/TestConcurrencyTests concurrency limiting (delays 2 seconds).
GET /api/IpRateLimit/NoLimitEndpoint without rate limiting (whitelisted).
GET /api/IpRateLimit/GetStatisticsReturns information about available policies.
GET /api/ClientRateLimit/GetClientInfoTests client-based rate limiting (requires X-ClientId header).
POST /api/ClientRateLimit/TestClientPolicyValidates client policy and whitelist.
GET /api/ClientRateLimit/HighFrequencyOperationSimulates high-frequency requests for testing.
GET /api/ClientRateLimit/GetConfigurationReturns client rate limiting configuration.
POST /api/ClientRateLimit/TestCombinedPolicyTests combined IP and Client policies.
GET /WeatherForecastGets weather forecast (protected by ApiPolicy).
GET /WeatherForecast/city/{city}Gets weather for specific city (protected by ApiPolicy).
GET /WeatherForecast/unlimitedGets weather without rate limiting.
# Make 10 rapid requests (expect 429 after 3rd request)
for i in {1..10}; do
curl -i http://localhost:5000/api/IpRateLimit/GetRateLimitInfo
echo "Request $i completed"
sleep 0.5
done# Test with custom client ID
for i in {1..15}; do
curl -H "X-ClientId: test-client" http://localhost:5000/api/ClientRateLimit/GetClientInfo
echo "Request $i completed"
sleep 0.5
done# No rate limiting for whitelisted clients
for i in {1..20}; do
curl -H "X-ClientId: dev-id-1" http://localhost:5000/api/ClientRateLimit/GetClientInfo
done# Test IP-based rate limiting
1..10 | ForEach-Object {
Invoke-RestMethod -Uri "http://localhost:5000/api/IpRateLimit/GetRateLimitInfo"
Write-Host "Request $_ completed"
Start-Sleep -Milliseconds 500
}- Create a collection with the endpoints above
- Use Collection Runner to execute multiple requests
- Observe 429 responses when limits are exceeded
- Check
Retry-Afterheader for wait time
Edit appsettings.json to customize rate limiting:
{
"RateLimiting": {
"GlobalPolicy": {
"PermitLimit": 10,
"Window": "00:01:00",
"QueueLimit": 0
},
"IpPolicy": {
"PermitLimit": 3,
"Window": "00:00:30"
},
"ApiPolicy": {
"PermitLimit": 6,
"Window": "00:01:00"
},
"ClientPolicy": {
"PermitLimit": 10,
"Window": "00:01:00"
},
"EndpointWhitelist": [
"GET:/api/license",
"GET:/api/status"
],
"IpWhitelist": [
"127.0.0.1",
"::1"
],
"ClientWhitelist": [
"dev-id-1",
"dev-id-2"
]
}
}- PermitLimit: Maximum number of requests allowed
- Window: Time window (format:
hh:mm:ss) - QueueLimit: Number of queued requests (0 = no queue)
- EndpointWhitelist: List of endpoints exempt from rate limiting (format:
METHOD:/path) - IpWhitelist: List of IP addresses exempt from rate limiting
- ClientWhitelist: List of client IDs exempt from rate limiting
{
"ipAddress": "192.168.1.1",
"message": "This endpoint is protected by IP-based rate limiting",
"policy": "IpPolicy: 3 requests per 30 seconds",
"timestamp": "2024-01-15T10:30:00Z"
}{
"message": "Too many requests. Please try again later.",
"statusCode": 429,
"retryAfterSeconds": 30
}Response Headers:
HTTP/1.1 429 Too Many Requests
Retry-After: 30
Content-Type: application/json
The application logs rate limiting events:
"Microsoft.AspNetCore.RateLimiting": "Information"View logs in console output:
info: Microsoft.AspNetCore.RateLimiting[2]
Rate limit exceeded for IP: 192.168.1.1
RateLimiting-NetCore6/
??? Controllers/
? ??? IpRateLimitController.cs # IP-based rate limiting demos
? ??? ClientRateLimitController.cs # Client-based rate limiting demos
? ??? WeatherForecastController.cs # API endpoint examples
??? ServiceCollection/
? ??? RateLimitingServiceCollection.cs # Rate limiting configuration
??? appsettings.json # Configuration file
??? Program.cs # Application entry point
??? WeatherForecast.cs # Model class
- Native Rate Limiting: Uses
System.Threading.RateLimitingnamespace - No External Packages: Built-in since .NET 7
- Multiple Algorithms: Fixed Window, Sliding Window, Token Bucket, Concurrency
- Attribute-based: Apply policies using
[EnableRateLimiting]and[DisableRateLimiting]
Heber Holanda
- GitHub: @HeberPcL