diff --git a/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs b/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs index 17c3b95eb..b1d0ac222 100644 --- a/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs @@ -70,6 +70,10 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController { this.RequestDuplication(); } + catch (BusinessValidationFailedException) + { + throw; + } catch (Exception) { @@ -106,17 +110,14 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController RequestTime = DateTime.Now }; - IRCSystemInfo.RequestRecordList= IRCSystemInfo.RequestRecordList.Where(x => x.RequestTime >= DateTime.Now.AddSeconds(-RequestDuplicationOptionsMonitor.CurrentValue.CacheTimeSeconds)).ToList(); - - - var requestsTimes = IRCSystemInfo.RequestRecordList.Any(x=> - x.RequestTime>= requestInfo.RequestTime.AddMilliseconds(-RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs)&& - x.RequestKey== requestInfo.RequestKey); - if (requestsTimes) + var isAdded = IRCSystemInfo.TryAddRequestRecord( + requestInfo, + RequestDuplicationOptionsMonitor.CurrentValue.CacheTimeSeconds, + RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs); + if (!isAdded) { throw new BusinessValidationFailedException(_localizer["RequestDuplicationFilter_RequestDuplication"], ApiResponseCodeEnum.BusinessValidationFailed); } - IRCSystemInfo.RequestRecordList.Add(requestInfo); } } diff --git a/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs b/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs index 757a1d7ae..1871801c2 100644 --- a/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs +++ b/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs @@ -146,6 +146,31 @@ public class RequestDuplicationOptions public static class IRCSystemInfo { public static List RequestRecordList { get; set; } = new List(); + + private static readonly object requestRecordLock = new object(); + + public static bool TryAddRequestRecord(RequestInfo requestInfo, int cacheTimeSeconds, int duplicationWindowMs) + { + lock (requestRecordLock) + { + var now = DateTime.Now; + RequestRecordList = RequestRecordList + .Where(x => x.RequestTime >= now.AddSeconds(-cacheTimeSeconds)) + .ToList(); + + var isDuplicate = RequestRecordList.Any(x => + x.RequestTime >= requestInfo.RequestTime.AddMilliseconds(-duplicationWindowMs) && + x.RequestKey == requestInfo.RequestKey); + + if (isDuplicate) + { + return false; + } + + RequestRecordList.Add(requestInfo); + return true; + } + } } public class RequestInfo @@ -236,4 +261,4 @@ public static class AppSettings } -} \ No newline at end of file +}