xxyy
2025-03-07 46ba61974b88fa75d1bcdad26709f2c3a945051e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using Microsoft.AspNetCore.Mvc.Filters;
using System.Collections.Concurrent;
 
public class ThrottleFilter : IAsyncActionFilter
{
    private static readonly ConcurrentDictionary<string, DateTime> _lastExecutionTimes = new ConcurrentDictionary<string, DateTime>();
    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();
    }
}