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();
|
}
|
}
|