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

RPM*_*984 14 asp.net asp.net-mvc bundle dynamic-content asp.net-optimization

我正在使用我的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是为静态内容而设计的,但事实并非如此

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

话虽这么说,这仍然是一个相关的问题(刷新包)所以我会把它打开..

Dav*_*tka 5

那个"魔法guid/string"是组合文件内容的散列.

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

http://localhost:20206/mybundle.css?v=-6520265193368900210
Run Code Online (Sandbox Code Playgroud)

现在,根据需要"触摸"其中一个文件而不实际更改内容.该文件较新(LastModified/LastWrite更新),但是哈希保持不变,因为它是从相同的组合内容计算的.你甚至可以在文件中添加空格,因为它们会被缩小.

http://localhost:20206/mybundle.css?v=-6520265193368900210
Run Code Online (Sandbox Code Playgroud)

接下来,实际做出改变.也许将边框设置为2px而不是1px.哈希将立即改变,因为提供哈希的内容已经改变.

http://localhost:20206/mybundle.css?v=-4725541136976015445
Run Code Online (Sandbox Code Playgroud)

最后,将边框设置回原来的状态(在上例中,返回1px)."魔法弦"实际上并非随机或魔法.相反,它返回到从内容计算的匹配单向哈希.

http://localhost:20206/mybundle.css?v=-6520265193368900210
Run Code Online (Sandbox Code Playgroud)

现在您可以轻松地休息,哈希只在需要时更新,无需人工干预.

至于你问题的其他部分,

当在数据库中更改此CSS/JS时,需要"刷新"该捆绑包,以便将这些文件的内容重新读入捆绑包.

我想我们只是扭转了这种想法.我们更新文件以触发刷新,而不是刷新捆绑包以触发重新读取.当ASP.NET看到文件发生变化时,它会重新组合内容并更新散列.