From ffe8ac13ba8bc9426f8b5f5b88f094a05b31b7ff Mon Sep 17 00:00:00 2001 From: xxyy <cathay_xy@163.com> Date: 星期一, 10 三月 2025 10:15:29 +0800 Subject: [PATCH] 增强功能与修复错误,更新缓存服务 --- Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs | 74 +++++++++++++++++++++++++++++++++++++ 1 files changed, 74 insertions(+), 0 deletions(-) diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs new file mode 100644 index 0000000..9d1ab3b --- /dev/null +++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Filter/ThrottleFilter.cs @@ -0,0 +1,74 @@ +锘縰sing Microsoft.AspNetCore.Mvc.Filters; +using System.Collections.Concurrent; +using System.Text.Json; + +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; + + var parameterString = GenerateParameterString(context.ActionArguments); + var key = $"{actionName}_{parameterString}"; + + if (_lastExecutionTimes.TryGetValue(key, out var lastExecutionTime)) + { + var elapsedTime = DateTime.Now - lastExecutionTime; + if (elapsedTime.TotalSeconds < _intervalInSeconds) + { + context.Result = new OkObjectResult(new WebResponseContent().Error("璇锋眰杩囦簬棰戠箒锛岃绋嶅悗鍐嶈瘯")); + return; + } + } + + _lastExecutionTimes[key] = DateTime.Now; + await next(); + } + + private string GenerateParameterString(IDictionary<string, object> arguments) + { + if (arguments == null || arguments.Count == 0) + { + return ""; + } + + var paramStrings = new List<string>(); + foreach (var argument in arguments) + { + var key = argument.Key; + var value = argument.Value; + string valueString; + + if (value == null) + { + valueString = "null"; + } + else if (IsSimpleType(value.GetType())) + { + valueString = value.ToString(); + } + else + { + valueString = JsonSerializer.Serialize(value); + } + + paramStrings.Add($"{key}={valueString}"); + } + + return string.Join("&", paramStrings); + } + + // 鍒ゆ柇绫诲瀷鏄惁涓虹畝鍗曠被鍨� + private bool IsSimpleType(Type type) + { + return type.IsPrimitive || type == typeof(string) || type == typeof(decimal); + } +} \ No newline at end of file -- Gitblit v1.9.3