每次部署MVC Web应用程序时,我的服务器都必须重新缓存所有js和css包。
因此,部署后第一个视图渲染可能需要几秒钟。
有没有办法预先缓存捆绑包?毕竟,文件在编译时是静态的。
答案 0 :(得分:11)
为了解决这个问题,我们将默认内存缓存替换为持续超出App Pool生命周期的缓存。
为此,我们继承了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
。