示例#1
0
        /// <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.");
            }
        }
示例#2
0
        /// <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);;
        }