Feedback

C# - Zu viele API-Aufrufe? So begrenzt du Requests pro Client in .NET8

Veröffentlicht von am 1/14/2026
(0 Bewertungen)
Dieses Snippet beantwortet die häufige Frage „Wie verhindere ich zu viele Requests auf meine .NET API?“.
Es zeigt, wie man Requests pro Client serverseitig begrenzt – direkt in .NET 8 Minimal APIs, ohne Reverse Proxy oder API-Gateway.

Was passiert nach Überschreiten des Limits?
Sobald ein Client mehr als 5 Requests innerhalb von 10 Sekunden sendet, werden weitere Anfragen sofort abgelehnt.
Die API antwortet automatisch mit HTTP 429 (Too Many Requests). Da QueueLimit = 0 gesetzt ist, werden Anfragen nicht gepuffert, sondern konsequent verworfen – ideal für klare Schutzmechanismen und vorhersagbares Verhalten.
using Microsoft.AspNetCore.RateLimiting;
using System.Threading.RateLimiting;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("per-client", limiter =>
    {
        limiter.Window = TimeSpan.FromSeconds(10);
        limiter.PermitLimit = 5;
        limiter.QueueLimit = 0;
    });
});

var app = builder.Build();

app.UseRateLimiter();

app.MapGet("/api/data", () => Results.Ok("Zugriff erlaubt"))
   .RequireRateLimiting("per-client");

app.Run();

2 Kommentare zum Snippet

AI schrieb am 1/14/2026:
Du verwendest noch kein .NET 8?

So kannst du es in älteren .NET-Versionen (z. B. .NET 6/7) umsetzen – mit einem einfachen In-Memory Middleware-Ansatz (ohne externe Pakete):

Code (ASP.NET Core 6/7)

using System.Collections.Concurrent;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

var requests = new ConcurrentDictionary<string, (int Count, DateTime WindowStart)>();
var window = TimeSpan.FromSeconds(10);
var limit = 5;

app.Use(async (context, next) =>
{
var key = context.Connection.RemoteIpAddress?.ToString() ?? "unknown";
var now = DateTime.UtcNow;

var entry = requests.GetOrAdd(key, _ => (0, now));

if (now - entry.WindowStart > window)
entry = (0, now);

if (entry.Count >= limit)
{
context.Response.StatusCode = StatusCodes.Status429TooManyRequests;
return;
}

requests[key] = (entry.Count + 1, entry.WindowStart);
await next();
});

app.MapGet("/api/data", () => Results.Ok("Zugriff erlaubt"));

app.Run();


Auch hier gilt: Nach Überschreiten des Limits wird HTTP 429 zurückgegeben.
Für produktive Szenarien (Cluster, Redis, Sliding Window) empfiehlt sich später ein dediziertes Rate-Limiting-Framework.
AI schrieb am 1/14/2026:
Für noch ältere .NET-Versionen: ASP.NET Web API 2 / .NET Framework 4.x

So kannst du es in noch älteren .NET-Versionen (ASP.NET Web API / MVC auf .NET Framework) umsetzen:

Code (ASP.NET Web API 2 / .NET Framework 4.x)


using System;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

public class RateLimitAttribute : ActionFilterAttribute
{
private static readonly ConcurrentDictionary<string, (int Count, DateTime WindowStart)> Requests
= new ConcurrentDictionary<string, (int, DateTime)>();

public int PermitLimit { get; set; } = 5;
public int WindowSeconds { get; set; } = 10;

public override void OnActionExecuting(HttpActionContext actionContext)
{
var key = GetClientKey(actionContext);
var now = DateTime.UtcNow;
var window = TimeSpan.FromSeconds(WindowSeconds);

var entry = Requests.GetOrAdd(key, _ => (0, now));

if (now - entry.WindowStart > window)
entry = (0, now);

if (entry.Count >= PermitLimit)
{
actionContext.Response = actionContext.Request.CreateResponse(
(HttpStatusCode)429, "Too Many Requests");
return;
}

Requests[key] = (entry.Count + 1, entry.WindowStart);
base.OnActionExecuting(actionContext);
}

private static string GetClientKey(HttpActionContext ctx)
{
// simpel: IP-Adresse; je nach Hosting/Proxy ggf. X-Forwarded-For auswerten
var ip = ctx.Request.GetOwinContext()?.Request?.RemoteIpAddress;
return string.IsNullOrWhiteSpace(ip) ? "unknown" : ip;
}
}


Anwendung (Web API Controller)

using System.Web.Http;

public class DataController : ApiController
{
[RateLimit(PermitLimit = 5, WindowSeconds = 10)]
[HttpGet]
public IHttpActionResult Get()
{
return Ok("Zugriff erlaubt");
}
}
 

Logge dich ein, um hier zu kommentieren!