Можете ли вы предварительно кэшировать пакеты ASP.NET?
Каждый раз, когда я развертываю веб-приложение MVC, мой сервер должен повторно кэшировать все пакеты js и css.
Из-за этого может потребоваться несколько секунд для отображения первого представления после развертывания.
Есть ли способ предварительного кэширования пакетов? В конце концов, файлы статичны во время компиляции.
1 ответ
Решение
Чтобы исправить это, мы заменили кэш-память по умолчанию кэшированием, которое сохранялось в течение срока службы пула приложений.
Для этого мы унаследовали от ScriptBundle
и перебор 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
,