xxyy
2025-03-07 a610ca9e97f456a7e87cb407bf6e353672472ec5
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 OkObjectResult(new WebResponseContent().Error("请求过于频繁,请稍后再试"));
                return;
            }
        }
 
        _lastExecutionTimes[actionName] = DateTime.Now;
        await next();
    }
}