public ThrottleLogEntry ComputeLogEntry( string requestId, RequestIdentity identity, ThrottleCounter throttleCounter, string rateLimitPeriod, long rateLimit) { return(new ThrottleLogEntry { ClientIp = identity.ClientIp, ClientKey = identity.ClientKey, Endpoint = identity.Endpoint, LogDate = DateTime.UtcNow, RateLimit = rateLimit, RateLimitPeriod = rateLimitPeriod, RequestId = requestId, StartPeriod = throttleCounter.Timestamp, TotalRequests = throttleCounter.TotalRequests }); }
public ThrottleCounter ProcessRequest(RequestIdentity requestIdentity, TimeSpan timeSpan, RateLimitPeriod period, out string id) { var throttleCounter = new ThrottleCounter() { Timestamp = DateTime.UtcNow, TotalRequests = 1 }; id = ComputeThrottleKey(requestIdentity, period); // serial reads and writes lock (ProcessLocker) { var entry = ThrottleRepo.FirstOrDefault(id); if (entry.HasValue) { // entry has not expired if (entry.Value.Timestamp + timeSpan >= DateTime.UtcNow) { // increment request count var totalRequests = entry.Value.TotalRequests + 1; // deep copy throttleCounter = new ThrottleCounter { Timestamp = entry.Value.Timestamp, TotalRequests = totalRequests }; } } // stores: id (string) - timestamp (datetime) - total (long) ThrottleRepo.Save(id, throttleCounter, timeSpan); } return(throttleCounter); }
/// <summary> /// Insert or update /// </summary> public void Save(string id, ThrottleCounter throttleCounter, TimeSpan expirationTime) { var cachePolicy = CachePolicy.WithSlidingExpiration(expirationTime); CacheManager.Set(id, throttleCounter, cachePolicy); }