...或者说我是怎样放下顾虑,开始使用微软完全没有文档记录的API写代码。是否有关于官方System.Web.Optimization
发布的实际文档呢?因为我真的找不到任何文档,没有XML文档,并且所有博客文章都涉及到与RC API截然不同的内容。总之...
我正在编写一些代码来自动解析javascript依赖项,并根据这些依赖关系即时创建bundle。一切都很好,除非您在不重新启动应用程序的情况下编辑脚本或进行其他更改会影响bundle,否则更改不会反映出来。因此,我添加了一个选项来禁用开发中的依赖项缓存。
但是,显然,BundleTables
即使bundle集合已更改,也会缓存URL。例如,在我的代码中,当我想要重新创建bundle时,我会执行以下操作:
// remove an existing bundle
BundleTable.Bundles.Remove(BundleTable.Bundles.GetBundleFor(bundleAlias));
// recreate it.
var bundle = new ScriptBundle(bundleAlias);
// dependencies is a collection of objects representing scripts,
// this creates a new bundle from that list.
foreach (var item in dependencies)
{
bundle.Include(item.Path);
}
// add the new bundle to the collection
BundleTable.Bundles.Add(bundle);
// bundleAlias is the same alias used previously to create the bundle,
// like "~/mybundle1"
var bundleUrl = BundleTable.Bundles.ResolveBundleUrl(bundleAlias);
// returns something like "/mybundle1?v=hzBkDmqVAC8R_Nme4OYZ5qoq5fLBIhAGguKa28lYLfQ1"
每当我删除并重新创建一个具有相同别名的bundle时,绝对不会发生任何事情:从ResolveBundleUrl
返回的bundleUrl
与我删除和重新创建bundle之前相同。这里所说的“相同”是指内容哈希值未更改以反映bundle的新内容。
编辑...实际上,情况比那更糟。bundle本身以某种方式被缓存在Bundles
集合外。如果我只是生成自己的随机哈希以防止浏览器缓存脚本,则ASP.NET会返回旧脚本。因此,从BundleTable.Bundles
中删除捆绑包实际上什么都没有做。
我可以简单地更改别名来解决这个问题,在开发中这是可以接受的,但我不喜欢这个想法,因为这意味着我必须在每次页面加载后弃用别名或者每次页面加载时BundleCollection都会增加大小。如果在生产环境中保留此设置,那将是一场灾难。
因此,似乎当服务于一个脚本时,它会独立于实际的BundleTables.Bundles
对象被缓存。因此,如果您重新使用URL,即使在重复使用之前已经删除了其引用的bundle,它也会响应其缓存中的内容,并且更改Bundles
对象不会刷新缓存 - 因此仅会使用新项(或者说具有不同名称的新项)。
这种行为看起来很奇怪……从集合中删除某些东西应该将其从缓存中删除。但是它没有。必须有一种方法可以清除此缓存并使用BundleCollection
的当前内容,而不是在第一次访问该bundle时缓存的内容。
您有任何想法如何做到这一点吗?
存在一个未知目的的ResetAll
方法,但它只会破坏事情,因此那不是解决方案。