验证重复请求加锁
parent
5275c86a02
commit
967438d4da
|
|
@ -70,6 +70,10 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
||||||
{
|
{
|
||||||
this.RequestDuplication();
|
this.RequestDuplication();
|
||||||
}
|
}
|
||||||
|
catch (BusinessValidationFailedException)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -106,17 +110,14 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController
|
||||||
RequestTime = DateTime.Now
|
RequestTime = DateTime.Now
|
||||||
};
|
};
|
||||||
|
|
||||||
IRCSystemInfo.RequestRecordList= IRCSystemInfo.RequestRecordList.Where(x => x.RequestTime >= DateTime.Now.AddSeconds(-RequestDuplicationOptionsMonitor.CurrentValue.CacheTimeSeconds)).ToList();
|
var isAdded = IRCSystemInfo.TryAddRequestRecord(
|
||||||
|
requestInfo,
|
||||||
|
RequestDuplicationOptionsMonitor.CurrentValue.CacheTimeSeconds,
|
||||||
var requestsTimes = IRCSystemInfo.RequestRecordList.Any(x=>
|
RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs);
|
||||||
x.RequestTime>= requestInfo.RequestTime.AddMilliseconds(-RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs)&&
|
if (!isAdded)
|
||||||
x.RequestKey== requestInfo.RequestKey);
|
|
||||||
if (requestsTimes)
|
|
||||||
{
|
{
|
||||||
throw new BusinessValidationFailedException(_localizer["RequestDuplicationFilter_RequestDuplication"], ApiResponseCodeEnum.BusinessValidationFailed);
|
throw new BusinessValidationFailedException(_localizer["RequestDuplicationFilter_RequestDuplication"], ApiResponseCodeEnum.BusinessValidationFailed);
|
||||||
}
|
}
|
||||||
IRCSystemInfo.RequestRecordList.Add(requestInfo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,31 @@ public class RequestDuplicationOptions
|
||||||
public static class IRCSystemInfo
|
public static class IRCSystemInfo
|
||||||
{
|
{
|
||||||
public static List<RequestInfo> RequestRecordList { get; set; } = new List<RequestInfo>();
|
public static List<RequestInfo> RequestRecordList { get; set; } = new List<RequestInfo>();
|
||||||
|
|
||||||
|
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
|
public class RequestInfo
|
||||||
|
|
@ -236,4 +261,4 @@ public static class AppSettings
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue