Ответ 1
Решение
Чтобы исправить, мы заменили кеш-память по умолчанию кэшированием, которое сохранялось за пределами срока использования приложения.
Для этого мы унаследовали от ScriptBundle
и overrode CacheLookup()
и 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
}
}
Осложнения
Единственный другой важный момент, который стоит отметить, связан с нашим постоянным кэширующим инструментом. Чтобы кэшировать, мы должны были иметь сериализуемый объект. К сожалению, BundleResponse
не помечен как Serializable
.
Нашим решением было создание небольшого класса полезности для деконструирования BundleResponse
в его значениях типов. Как только мы это сделали, мы смогли сериализовать класс утилиты. Затем, извлекая из кеша, мы восстанавливаем BundleResponse
.