【问题标题】:Can you pre-cache ASP.NET Bundles?您可以预缓存 ASP.NET 捆绑包吗?
【发布时间】:2013-07-13 20:04:21
【问题描述】:

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

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

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

【问题讨论】:

  • 如果我了解捆绑的工作原理,它会缓存在应用程序域的内存中。在编译时,显然没有应用程序域,因此没有缓存文件的地方。你确定捆绑是需要这么长时间的吗?我无法想象读取一堆静态文件并在运行时将它们转储到内存中需要不到一秒钟的时间。但是,在没有捆绑的情况下重新启动应用程序通常仍然需要几秒钟。
  • @JoeEnos 是的,这就是我在网上的想法和发现的。我只是想要第二个意见。谢谢。
  • 不同的解决方案,我想尽可能地消除所有预热成本,所以我让我的 app_start 对我的RouteTable 中的每条路由发出后台网络请求。

标签: c# asp.net asp.net-optimization system.web.optimization


【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多