Solution
To fix we replaced the default memory cache with caching that persisted beyond the App Pool life.
To do this we inherited from ScriptBundle
and overrode CacheLookup()
and UpdateCache()
.
/// <summary>
/// override cache functionality in ScriptBundle to use
/// persistent cache instead of HttpContext.Current.Cache
/// </summary>
public class ScriptBundleUsingPersistentCaching : ScriptBundle
{
public ScriptBundleUsingPersistentCaching(string virtualPath)
: base(virtualPath)
{ }
public ScriptBundleUsingPersistentCaching(string virtualPath, string cdnPath)
: base(virtualPath, cdnPath)
{ }
public override BundleResponse CacheLookup(BundleContext context)
{
//custom cache read
}
public override void UpdateCache(BundleContext context, BundleResponse response)
{
//custom cache save
}
}
Complications
The only other wrench worth noting had to do with our persistent caching tool. In order to cache we had to have a serializable object. Unfortunately, BundleResponse
is not marked as Serializable
.
Our solution was to create a small utility class to deconstruct BundleResponse
into its value types. Once we did this we were able to serialize the utility class. Then, when retrieving from the cache, we reconstruct the BundleResponse
.
RouteTable
. – Billion