15

每次我部署 MVC Web 应用程序时,我的服务器都必须重新缓存所有 js 和 css 包。

因此,部署后第一个视图可能需要几秒钟才能呈现。

有没有办法预先缓存捆绑包?毕竟,文件在编译时是静态的。

4

1 回答 1

12

解决方案

为了解决这个问题,我们用超出 App Pool 生命周期的缓存替换了默认内存缓存。

为此,我们继承ScriptBundle并覆盖了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
    }
}

并发症

唯一值得注意的其他扳手与我们的持久缓存工具有关。为了缓存,我们必须有一个可序列化的对象。不幸的是,BundleResponse没有标记为Serializable

我们的解决方案是创建一个小型实用程序类来解构BundleResponse它的值类型。一旦我们这样做了,我们就能够序列化实用程序类。然后,当从缓存中检索时,我们重建BundleResponse.

于 2013-07-16T19:46:50.570 回答