Можете ли вы предварительно кэшировать пакеты 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,

Другие вопросы по тегам