14

我在我的 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(一次,然后缓存)。这样我就可以轻松地刷新它,只需清除缓存即可。

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

4

2 回答 2

5

“那个魔法 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 看到文件更改时,它将重新组合内容并更新哈希。

于 2012-04-03T21:11:44.117 回答
3

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

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

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

于 2012-08-23T17:49:08.950 回答