/// <summary> /// Updates a cached request when the item has expired. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="arguments"></param> public void CacheUpdated <T>(CacheEntryUpdateArguments arguments) where T : new() { if (arguments.RemovedReason == CacheEntryRemovedReason.Expired) { CachedRequestResponse <T> cachedItem = arguments.Source[arguments.Key] as CachedRequestResponse <T>; log.DebugFormat("Cache item expired and being updated for request: {0}", GetRequestUrl(cachedItem.Request)); CachedRequestResponse <T> newCachedItem = new CachedRequestResponse <T>(); newCachedItem.Request = cachedItem.Request; newCachedItem.Data = this.ExecuteRestRequest <T>(cachedItem.Request); newCachedItem.LastCached = DateTime.Now; newCachedItem.Duration = cachedItem.Duration; newCachedItem.KeepCurrent = true; CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.Now.Add(cachedItem.Duration); policy.UpdateCallback = CacheUpdated <T>; arguments.UpdatedCacheItem = new CacheItem(arguments.Key, newCachedItem); arguments.UpdatedCacheItemPolicy = policy; //MemoryCache cache = MemoryCache.Default; log.Debug("Request automatically recached."); } }
/// <summary> /// Get a RestResponse from the cached based on the URL. /// </summary> /// <typeparam name="T">The RestResponse type to retrieve from the cache.</typeparam> /// <param name="url">The url</param> /// <returns></returns> public T CachedExecute <T>(RestRequest request, CacheSettings settings) where T : new() { string key = GenerateCacheKey(request); MemoryCache cache = MemoryCache.Default; // Get the response from the cache CachedRequestResponse <T> cachedItem = cache[key] as CachedRequestResponse <T>; if (cachedItem == null) { log.DebugFormat("Response not cached, sending request"); cachedItem = new CachedRequestResponse <T>(); // Response not cached, so execute the request and get the response cachedItem.Request = request; cachedItem.Data = this.ExecuteRestRequest <T>(request); cachedItem.LastCached = DateTime.Now; cachedItem.Duration = settings.Duration; cachedItem.KeepCurrent = settings.KeepCurrent; CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.Now.Add(settings.Duration); // Keep the cache updated if requested and it has expired if (settings.KeepCurrent) { policy.UpdateCallback = CacheUpdated <T>; } cache.Set(key, cachedItem, policy); log.DebugFormat("Response cached"); } else { log.Debug("Response retrieved from cache."); } return(cachedItem.Data);; }