新的ASP.NET捆绑功能 - 如何以编程方式刷新特定捆绑包?

14

我正在尝试使用ASP.NET捆绑功能(使用System.Web.Optmization 1.0.0-beta预发布版)在我的ASP.NET MVC 3 Web应用程序中。这很好用。

但是,我们有某些存储在数据库中的动态CSS / JS。我想将其添加到我的核心捆绑包("DynamicBundle")的单独捆绑包中。我知道如何做到这一点,没有问题。现在我的问题是,当此CSS / JS在数据库中更改时,必须“刷新”该捆绑包,以便重新读取这些文件的内容到捆绑包中。

实际上,我需要ASP.NET重新生成附加到捆绑包URL的Magic GUID / string。理想情况下,我只想刷新一个特定的捆绑包,而不是整个捆绑表。有方法可以做到这一点吗?

编辑:

好的,第二个问题,无法弄清楚如何将动态CSS / JS添加到捆绑包中。bundle.AddFile需要一个虚拟路径指向文件,但它不是物理文件,而是字符串。我该怎么办?我肯定不必先将字符串写成文件吧?

编辑2:

所以我决定不将我的动态内容捆绑。由于两个原因:

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

因此,我已经在运行时手动缩小了我的动态css / js(一次,然后缓存)。这样我就可以通过简单地清除缓存来轻松刷新它。

话虽如此,这仍然是一个相关的问题(刷新捆绑包),所以我会把它留着开放状态..


似乎对你来说,一个自定义处理程序可以更好地输出动态JS / CSS。这是一些在运行时生成JS的其他引擎的工作方式(例如,Ajax.NET Pro就是这样做的:http://ajaxpro.codeplex.com/)。或者,您可以使用一个简单的.aspx页面返回动态内容,并设置缓存标头以不缓存,以便客户端每次请求它。 - nothingisnecessary
2个回答

5

“那个神奇的guid或字符串”是文件内容的哈希值。

你可以使用以下工作流进行测试,前提是你有一个名为mybundle.css的文件。如果你使用Fiddler观察流量,你会看到它请求一个类似于哈希值的东西。

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

现在,你可以随意“触碰”绑定包中的任意一个文件而不会实际改变其内容。该文件将会更新(LastModified / LastWrite 更为新),但哈希值将仍保持不变,因为它是由相同的组合内容计算出来的。你甚至可以添加空格到该文件中,因为这些内容将被压缩掉。
http://localhost:20206/mybundle.css?v=-6520265193368900210

接下来,真正开始做出改变。也许将边框设置为2像素而不是1像素。现在哈希值会发生变化,因为提供哈希值的内容已经改变。

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

最后,将边框设置回原来的状态(在上面的示例中,将其设置回 1px)。这个“魔术字符串”实际上并不是随机或魔法。而是返回到从内容计算出的匹配单向哈希。

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

现在你可以放心,哈希值将只在需要时更新,无需手动干预。
至于你提出的另一个问题,
当数据库中的CSS/JS发生更改时,必须“刷新”该捆绑包,以便重新读取文件内容。
我认为我们可以反向思考。我们不是通过刷新捆绑包来触发重新读取操作,而是通过更新文件来触发刷新。当ASP.NET检测到文件发生更改时,它将重新组合内容并更新哈希值。

1
我知道如何做到这一点,但我问的是如何以编程方式实现。你是在建议我在实际应用程序代码中“触摸”文件吗?例如StreamWriter的东西? - RPM1984
我的答案的重点是你不需要做你认为需要做的事情...字符串不是"魔法"。无论在包中包含什么,如果有更改,"魔法字符串"将基于这些内容进行更新。 - David Ruttka
仅仅触碰是不够的,因为你实际上需要改变内容。你可以使用 StreamWriter 将数据库中更改后的内容保存到物理文件中,这样哈希值就会自动处理。 - David Ruttka
很好。但我希望有一种内置的方法来刷新bundle。我想问题的一部分在于bundle是基于物理文件工作的,而这不是一个物理文件,它是DB中的一个字符串。正如我在我的编辑中所说,我无法捆绑此文件。所以,是的,这有点无意义。 - RPM1984
是的,我想我陷入了回答原始问题(通知ASP.NET数据库字符串已更改)和剩余一般情况(如何刷新由物理文件组成的捆绑包)的混合模式。最终,我希望这对于将来可能想知道哈希来自何处以及什么触发更新的人来说是有用的。 - David Ruttka

3
我有好消息告诉你。许多人一直在要求虚拟路径提供程序支持类似于您的情况,其中他们的内容不一定来自磁盘,因此我们目前计划在下一个版本中支持VPP。
为了利用这种支持,您需要为您的动态js/css实现VPP。
VPP还具有内置的缓存依赖机制,因此我们应该能够使用它们来自动刷新正确的捆绑缓存条目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接