void DoCacheInsert (HttpContext context, HttpApplication app, HttpResponse response) { string vary_key = context.Request.FilePath; string key; OutputCacheProvider provider = FindCacheProvider (app); CachedVaryBy varyby = provider.Get (vary_key) as CachedVaryBy; CachedRawResponse prev = null; bool lookup = true; string cacheKey = null, cacheValue = null; HttpCachePolicy cachePolicy = response.Cache; if (varyby == null) { varyby = new CachedVaryBy (cachePolicy, vary_key); provider.Add (vary_key, varyby, Cache.NoAbsoluteExpiration); lookup = false; cacheKey = vary_key; } key = varyby.CreateKey (vary_key, context); if (lookup) prev = provider.Get (key) as CachedRawResponse; if (prev == null) { CachedRawResponse c = response.GetCachedResponse (); if (c != null) { string [] keys = new string [] { vary_key }; DateTime utcExpiry, absoluteExpiration; TimeSpan slidingExpiration; c.VaryBy = varyby; varyby.ItemList.Add (key); if (cachePolicy.Sliding) { slidingExpiration = TimeSpan.FromSeconds (cachePolicy.Duration); absoluteExpiration = Cache.NoAbsoluteExpiration; utcExpiry = DateTime.UtcNow + slidingExpiration; } else { slidingExpiration = Cache.NoSlidingExpiration; absoluteExpiration = cachePolicy.Expires; utcExpiry = absoluteExpiration.ToUniversalTime (); } provider.Set (key, c, utcExpiry); HttpRuntime.InternalCache.Insert (key, c, new CacheDependency (null, keys), absoluteExpiration, slidingExpiration, CacheItemPriority.Normal, response_removed); cacheValue = key; } } if (cacheKey != null) { lock (keysCacheLock) { if (keysCache == null) { BuildManager.RemoveEntry += new BuildManagerRemoveEntryEventHandler (OnBuildManagerRemoveEntry); keysCache = new Dictionary <string, string> (StringComparer.Ordinal); keysCache.Add (cacheKey, cacheValue); } else if (!keysCache.ContainsKey (cacheKey)) keysCache.Add (cacheKey, cacheValue); } } }