我正在使用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: 所以我决定不捆绑我的动态内容。有两个原因:
所以我所做的是在运行时手动缩小我的动态css / js(一次,然后缓存)。这样我就可以通过简单地清除缓存来轻松刷新它。
话虽如此,这仍然是一个相关的问题(令人耳目一新的捆绑),所以我会把它打开..
答案 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还内置了缓存依赖机制,因此我们应该能够使用这些机制为您自动刷新正确的捆绑缓存条目。