【问题标题】:Bundles Caching and Web farms捆绑缓存和 Web 场
【发布时间】:2014-01-31 16:03:47
【问题描述】:

我想知道动态修改捆绑包集合的含义(比如在页面加载期间)。我尝试将一个新的脚本文件添加到 bundles 集合(最初在 app_start 中创建)。它在我的初始测试中运行良好 - 我注意到的一个区别是浏览器没有缓存捆绑的脚本和样式(每次刷新时发送新请求)。我想知道是否有办法在初始提取后强制缓存捆绑脚本/样式。

我将我的静态脚本和样式加载到 app_start 本身的 bundles 集合中。但是我在母版页加载中有一段代码,用于检查页面特定脚本或样式的存在(例如,假设正在加载页面 ABC.aspx,此代码将在 Scripts 文件夹中查找 ABC.js 的存在和ABC.css 在 Styles 文件夹中)。如果存在,它将被加载到页眉中。这是我尝试将其添加到捆绑包的地方。使这些条件脚本/样式成为默认捆绑包集合的一部分的最佳方法是什么?

我的生产环境是一个网络农场。那么我应该特别做些什么来让 url V 哈希在服务器之间保持相同?

我读过“Hao Kung”here 的评论,解释了 webfarm 的包缓存问题(结果为 404),处理此问题的最佳方法是什么?

【问题讨论】:

    标签: asp.net caching bundling-and-minification minify web-farm


    【解决方案1】:

    AFAIK,在构建捆绑包时,会对内容进行哈希处理,以便为其创建唯一键(url 中的额外参数)。

    因此,如果您要修改其内容,哈希值将会改变,因为它实际上代表了一个不同的包。这样做的全部目的是在内容发生变化时进行缓存清除。

    您看到的行为是因为捆绑包不打算以这种动态方式使用,因为它违背了捆绑包的内容是静态的(因此是可缓存的)的想法。

    为什么不为每个页面创建一个单独的捆绑包? 这样,带有所有共享代码的“通用”包将被缓存和重用,并且在加载 ABC.aspx 页面时,您始终会加载“abc”包,它将对内容进行自己的版本控制,而不是影响公共库。

    另外,修改每个页面上的捆绑包还有一个缺点:

    如果每个页面提供不同的捆绑包,那么客户端将一遍又一遍地接收您共享库的所有代码,每个页面一次。即使被缓存。例如:将 JQuery 与每个页面一起发送是没有意义的。

    【讨论】:

    • 感谢 Pablo 的建议。
    • 感谢巴勃罗的建议。是的,最好让捆绑包尽可能保持静态。我同意这一点。我的另一个问题是,我应该做任何特定的设置来使捆绑包的静态散列在网络场中的所有服务器上都相同吗?
    • 当然。关于服务器,没有我知道的设置。它是根据每个文件的内容计算的,因此如果内容相同,则应该没有太大问题。但是,当服务器运行的 .NET 版本不同时,有些人报告了问题,例如:stackoverflow.com/a/15071452/1373170
    • 谢谢。就我而言,可以确保农场上的所有盒子都具有相同的配置。所以我想,我可以放心地处理这个问题:)
    • 是的,我想是的,但为了以防万一,测试它仍然是一个好主意。我个人对此没有任何问题。现在,如果您仍要动态添加捆绑包,请注意该链接中提到的问题(404 问题)。我一直让它们保持静态,所以我不能确切地说它在那种情况下会如何表现。
    猜你喜欢
    • 2013-01-21
    • 2012-10-15
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多