/// <summary> /// Gets an item with a specified key from the HttpRuntime.Cache. /// </summary> /// <param name="key">The cache key.</param> /// <param name="loadObj">The delegate returning the item to insert into cache when it doesn't exist.</param> /// <param name="priority">The priority.</param> /// <param name="autoInsertDependency">If set to true, a dependency will be automatically created when no cache /// dependency is currently set. If this value is false and you try to retrieve an item from cache that was not added /// first, this method will return null.</param> /// <returns> /// The cached item when present at HttpRuntime.Cache, the loadObj delegate (which re-adds the item /// at cache) when the item can't be found at cache, null if the cache item dependency doesn't exist and autoInsertDependency /// is set to false or the loadObj delegate returned null. /// </returns> public static object GetCacheItem(string key, ReloadObjectAtCache loadObj, CacheItemPriority priority, bool autoInsertDependency) { object fetchedItem = null; switch (ClusteredCacheController.ClusteredCachingMode) { case ClusteredCachingMode.ServiceBroker: #region service broker lock (_CacheLock) { if (HttpRuntime.Cache[key] == null) { // check whether we have a dependency... string dependencyId = GetDependencyIDFromCacheKey(key); if (!string.IsNullOrEmpty(dependencyId) || autoInsertDependency) { // we actually have a dependency, so refresh the cache... try { fetchedItem = loadObj(); } catch (Exception err) { throw new CachingException("Error at loading object into cache. See the inner exception for further details.", err); } if (fetchedItem == null) { // we can't insert null as an object, so simply return null. return(null); } HttpRuntime.Cache.Insert(key, fetchedItem, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, priority, null); return(fetchedItem); } else { // this key doesn't exist and there is no associated dependency, so return null... return(null); } } return(HttpRuntime.Cache[key]); } #endregion case ClusteredCachingMode.CheckAtRequest: #region Check at request long synchTicks = -1; lock (_CacheLock) { ClusteredCachingSynchronizationStatus status = IsUpToDate(key, out synchTicks); switch (status) { case ClusteredCachingSynchronizationStatus.UpToDate: if (HttpRuntime.Cache[key] == null) { try { fetchedItem = loadObj(); } catch (Exception err) { throw new CachingException("Error at loading object into cache. See the inner exception for further details.", err); } if (fetchedItem == null) { // we can't insert null as an object, so simply return null. return(null); } HttpRuntime.Cache.Insert(key, fetchedItem, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, priority, null); return(fetchedItem); } return(HttpRuntime.Cache[key]); case ClusteredCachingSynchronizationStatus.OutOfDate: CheckAtRequestDependencies[key] = GetCheckAtRequestInfo(synchTicks); HttpRuntime.Cache.Remove(key); try { fetchedItem = loadObj(); } catch (Exception err) { throw new CachingException("Error at loading object into cache. See the inner exception for further details.", err); } if (fetchedItem == null) { // we can't insert null as an object, so simply return null. return(null); } HttpRuntime.Cache.Insert(key, fetchedItem, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, priority, null); return(fetchedItem); case ClusteredCachingSynchronizationStatus.NotFound: CheckAtRequestDependencies.Add(key, GetCheckAtRequestInfo(synchTicks)); HttpRuntime.Cache.Remove(key); try { fetchedItem = loadObj(); } catch (Exception err) { throw new CachingException("Error at loading object into cache. See the inner exception for further details.", err); } if (fetchedItem == null) { // we can't insert null as an object, so simply return null. return(null); } HttpRuntime.Cache.Insert(key, fetchedItem, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, priority, null); return(fetchedItem); case ClusteredCachingSynchronizationStatus.RemovedFromCollection: if (autoInsertDependency) { try { fetchedItem = loadObj(); } catch (Exception err) { throw new CachingException("Error at loading object into cache. See the inner exception for further details.", err); } AddCacheItem(key, fetchedItem, priority); return(fetchedItem); } else { HttpRuntime.Cache.Remove(key); CheckAtRequestDependencies.Remove(key); return(null); } } break; } #endregion } return(null); }
/// <summary> /// Gets an item with a specified key from the HttpRuntime.Cache. /// </summary> /// <param name="key">The cache key.</param> /// <param name="loadObj">The delegate returning the item to insert into cache when it doesn't exist.</param> /// <param name="priority">The priority.</param> /// <returns> /// The cached item when present at HttpRuntime.Cache, the loadObj delegate (which re-adds the item /// at cache) when the item can't be found at cache, null if the cache item dependency doesn't exist /// or the loadObj delegate returned null. /// </returns> public static object GetCacheItem(string key, ReloadObjectAtCache loadObj, CacheItemPriority priority) { return(GetCacheItem(key, loadObj, priority, false)); }