... or 我是如何学会不再担心,而只是针对微软完全没有文档记录的 API 编写代码的. Is there any actual documentation of the official System.Web.Optimization
release? 'cuz I sure can't find any, there's no XML docs, and all the blog posts refer to the RC API which is substantially different. Anyhoo..
我正在编写一些代码来自动解决 javascript 依赖关系,并且正在动态地从这些依赖关系中创建包。除了在不重新启动应用程序的情况下编辑脚本或做出会影响捆绑包的更改外,其他操作都可以很好地工作,这些更改将不会被反映出来。因此,我添加了一个选项来禁用在开发中使用的依赖项的缓存。
但是,显然 BundleTables
缓存了 URL 即使 bundle 集合已经更改。例如,在我自己的代码中,当我想重新创建一个 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"
每当我删除并重新创建一个包 用同样的化名,绝对没有任何事情发生: 从 ResolveBundleUrl
返回的 bundleUrl
与我删除并重新创建这个包之前是一样的。我所说的“相同”是指内容散列不变,以反映捆绑包的新内容。
编辑 ... 实际上,情况要比这糟糕得多。捆绑自己以某种方式缓存在 Bundles
集合之外。如果我只是生成自己的随机散列来阻止浏览器缓存脚本,ASP.NET 将返回 旧剧本。因此,显然,从 BundleTable.Bundles
中移除一个包实际上不会做任何事情。
我可以简单地改变别名来解决这个问题,这对于开发来说是可以的,但是我不喜欢这个想法,因为这意味着在每次页面加载之后我不得不放弃别名,或者有一个 BundleCollection,在每次页面加载之后它的大小都会增加。如果在生产环境中保留这个选项,那将是一场灾难。
因此,当提供一个脚本时,它似乎独立于实际的 BundleTables.Bundles
对象被缓存。因此,如果你重用一个 URL,即使你在重用它之前删除了它所引用的捆绑包,它也会响应其缓存中的任何内容,并且改变 Bundles
对象不会刷新缓存——所以只有 新的条目(或者更确切地说,不同名称的新条目)会被使用。
这种行为似乎很奇怪... 从集合中删除某些东西应该从缓存中删除它。但事实并非如此。必须有一种方法来刷新这个缓存,并让它使用 BundleCollection
的当前内容,而不是在首次访问该包时缓存的内容。
你知道我会怎么做吗?
有这样一个 ResetAll
方法,它有一个未知的用途,但它只是破坏事物,所以这不是它。