...或者我是如何学会不再担心的,只是针对Microsoft完全未记录的API编写代码。官方System.Web.Optimization
发布有任何实际文档吗?“因为我肯定找不到任何东西,没有XML文档,并且所有博客文章都引用了RC API,这有很大的不同。嗯...
我正在编写一些代码来自动解决javascript依赖关系,并从这些依赖关系动态创建捆绑。一切正常,除非您编辑脚本或以其他方式进行更改而影响捆绑软件,而无需重新启动应用程序,则所做的更改将不会得到体现。因此,我添加了一个选项来禁用对依赖项的缓存以供在开发中使用。
但是,即使bundle集合已更改,也显然会BundleTables
缓存URL 。例如,在我自己的代码中,当我想重新创建捆绑包时,我会执行以下操作:
// 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"
每当我删除并重新创建具有相同别名的包时,绝对不会发生任何事情:bundleUrl
从中返回ResolveBundleUrl
的内容与我删除并重新创建包之前的相同。“相同”是指内容散列未更改以反映包的新内容。
编辑……实际上,比这差得多。该束本身以某种方式以外的缓存Bundles
集合。如果我只是生成自己的随机哈希表以防止浏览器缓存脚本,则ASP.NET将返回旧脚本。因此,很显然,从中删除捆绑BundleTable.Bundles
实际上并没有任何作用。
我可以简单地更改别名来解决此问题,这对于开发来说是可以的,但是我不喜欢这种想法,因为这意味着要么必须在每次页面加载后就弃用别名,要么要拥有一个BundleCollection,其大小会随着每页加载。如果您将其保留在生产环境中,那将是一场灾难。
因此,似乎在提供脚本后,便会独立于实际BundleTables.Bundles
对象对其进行缓存。因此,即使您重用了URL,即使您在重用URL之前已经删除了它所引用的包,它也会以缓存中的内容作为响应,并且更改Bundles
对象不会刷新缓存-因此,只有新项目(或而是会使用其他名称的新商品)。
行为似乎很奇怪...从集合中删除某些内容应该将其从缓存中删除。但事实并非如此。必须有一种刷新此缓存的方法,并使其使用当前的内容,BundleCollection
而不是第一次访问该捆绑包时缓存的内容。
知道我该怎么做吗?
有一种ResetAll
方法的目的不明,但它还是会破坏事物,不是吗。