using Microsoft.AspNetCore.Mvc.Filters; using System.Collections.Concurrent; public class ThrottleFilter : IAsyncActionFilter { private static readonly ConcurrentDictionary _lastExecutionTimes = new ConcurrentDictionary(); private readonly int _intervalInSeconds; public ThrottleFilter(int intervalInSeconds) { _intervalInSeconds = intervalInSeconds; } public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var actionName = context.ActionDescriptor.DisplayName; if (_lastExecutionTimes.TryGetValue(actionName, out var lastExecutionTime)) { var elapsedTime = DateTime.Now - lastExecutionTime; if (elapsedTime.TotalSeconds < _intervalInSeconds) { context.Result = new Microsoft.AspNetCore.Mvc.StatusCodeResult(429); return; } } _lastExecutionTimes[actionName] = DateTime.Now; await next(); } }