【问题标题】:New ASP.NET Bundling Features - How can i programmatically refresh a certain bundle?新的 ASP.NET 捆绑功能 - 如何以编程方式刷新某个捆绑包?
【发布时间】:2012-04-12 14:47:26
【问题描述】:

我在我的 ASP.NET MVC 3 Web 应用程序中使用新的 ASP.NET 捆绑功能(使用 System.Web.Optmization 1.0.0-beta 预发行版)。

效果很好。

但是,我们有一些 动态 CSS/JS 存储在数据库中。

我想将此添加到我的核心捆绑包的单独捆绑包中,例如“DynamicBundle”。我知道该怎么做,这不是问题。

现在我的问题是,当数据库中的 CSS/JS 发生更改时,需要“刷新”该包,以便将这些文件的内容重新读入包中。

基本上,我需要 ASP.NET 来重新生成附加到捆绑 URL 的魔法 guid/字符串。

理想情况下,我只想刷新一个特定包,而不是整个包表。

有没有办法做到这一点?

编辑:

好的第二个问题,不知道如何将动态 CSS/JS 添加到包中。 bundle.AddFile 获取文件的虚拟路径,但它不是物理文件,而是字符串。我该怎么做?当然我不必先将字符串写入文件吗?

编辑 2: 所以我决定不捆绑我的动态内容。有两个原因:

  1. 它只有 1 个文件,所以我没有获得任何“捆绑”好处
  2. 捆绑是为静态内容设计的,这不是

所以我所做的是在运行时手动缩小我的动态 css/js(一次,然后缓存)。这样我就可以轻松刷新它,只需清除缓存即可。

话虽如此,这仍然是一个相关问题(刷新捆绑包),所以我将保持打开状态..

【问题讨论】:

  • 看起来像吐出动态 JS / CSS 的自定义处理程序可能更适合您。这就是其他一些在运行时生成 JS 的引擎的工作方式(例如,Ajax.NET Pro 就是这样做的:ajaxpro.codeplex.com)。您也可以使用返回动态内容的简单 .aspx 页面,并将缓存标头设置为不缓存,以便客户端每次都请求它。

标签: asp.net asp.net-mvc bundle asp.net-optimization dynamic-content


【解决方案1】:

“那个魔法 guid/字符串”是组合文件内容的哈希值。

您可以使用以下假设您拥有mybundle.css 的工作流程对此进行测试。如果你使用 Fiddler 来观察流量,你会看到它请求一些像

这样的哈希值
http://localhost:20206/mybundle.css?v=-6520265193368900210

现在,在不实际更改内容的情况下,随心所欲地“触摸”捆绑包中的其中一个文件。该文件较新(LastModified / LastWrite 较新),但哈希值保持不变,因为它是根据相同的组合内容计算的。您甚至可以在文件中添加空格,因为它们会被缩小。

http://localhost:20206/mybundle.css?v=-6520265193368900210

接下来,实际进行更改。也许将边框设置为 2px 而不是 1px。哈希现在会改变,因为提供哈希的内容已经改变。

http://localhost:20206/mybundle.css?v=-4725541136976015445

最后,将边框设置回原来的样子(在上面的示例中,设置回 1px)。 “魔术字符串”实际上根本不是随机的或魔术。相反,它返回从内容计算的匹配单向哈希。

http://localhost:20206/mybundle.css?v=-6520265193368900210

现在您可以放心,哈希只会在需要时更新,无需人工干预。

至于你问题的另一部分,

当这个 CSS/JS 在数据库中被改变时,那个包需要被 “刷新”,以便将这些文件的内容重新读入 捆绑。

我认为我们只是颠倒了想法。我们不是通过刷新包来触发重新读取,而是更新文件来触发刷新。当 ASP.NET 看到文件更改时,它将重新组合内容并更新哈希。

【讨论】:

  • 我知道如何做到这一点,但我问如何以编程方式做到这一点。您是否建议我在实际应用程序代码中“触摸”该文件?例如 StreamWriter 的东西?
  • 我回答的重点是你不需要做你认为你需要做的事情......字符串不是“魔术”。无论捆绑中包含什么,如果它发生变化,“魔术字符串”将根据这些内容进行更新。
  • 触摸是不够的,因为您实际上需要更改内容。您可以使用 StreamWriter 将更改的内容从 db 保存到物理文件中,在这种情况下,哈希将自行处理。
  • 很公平。但我希望有一个内置的方法来刷新包。我想这里的部分问题是捆绑包适用于物理文件,这不是物理文件,它是数据库中的字符串。正如我在编辑中所说,我无论如何都不能捆绑这个文件。所以,是的,这是一个有争议的问题。
  • 是的,我想我进入了回答原始问题(通知 ASP.NET DB 字符串已更改)和其余一般情况(如何刷新由物理文件)。最终,我希望它为将来可能想知道哈希来自何处以及触发更新的原因的人们提供。
【解决方案2】:

我要告诉你一个好消息。许多人一直在要求虚拟路径提供程序支持类似于您的场景,他们的内容不一定来自磁盘,因此我们目前计划在下一个版本中支持 VPP。

要利用此支持,您必须为您的动态 js/css 实现 VPP。

VPP 还内置了缓存依赖机制,因此我们应该能够使用这些机制为您自动刷新正确的包缓存条目。

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2017-11-05
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多