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

时间:2012-03-28 23:35:45

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

我正在使用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. 这只是一个文件,所以我没有获得任何“捆绑”好处
  2. Bundling是针对静态内容而设计的,这不是
  3. 所以我所做的是在运行时手动缩小我的动态css / js(一次,然后缓存)。这样我就可以通过简单地清除缓存来轻松刷新它。

    话虽如此,这仍然是一个相关的问题(令人耳目一新的捆绑),所以我会把它打开..

2 个答案:

答案 0 :(得分:5)

那个“魔法guid / string”是组合文件内容的散列。

您可以使用以下工作流程对此进行测试,该工作流程假定您拥有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看到文件发生变化时,它会重新组合内容并更新散列。

答案 1 :(得分:3)

我有个好消息。许多人一直在寻求虚拟路径提供程序支持类似于您的方案,其中包含的内容不一定来自磁盘,因此我们目前正计划在下一版本中支持VPP。

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

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