... or 我如何学会停止担忧,只针对 Microsoft 完全未记录的 API 编写代码。有没有官方的实际文档System.Web.Optimization
发布?因为我确实找不到任何内容,没有 XML 文档,而且所有博客文章都引用了 RC API,这有很大不同。无论如何..
我正在编写一些代码来自动解析 javascript 依赖项,并根据这些依赖项动态创建捆绑包。一切都运行良好,除非您编辑脚本或以其他方式进行会影响捆绑包而不重新启动应用程序的更改,否则这些更改将不会得到反映。因此,我添加了一个选项来禁用开发中使用的依赖项的缓存。
然而,显然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
与我删除并重新创建捆绑包之前相同。我所说的“相同”是指内容哈希值发生更改以反映捆绑包的新内容。
edit……实际上,情况比这更糟糕。这捆绑本身以某种方式缓存在外部Bundles
收藏。如果我只是生成自己的随机散列以防止浏览器缓存脚本,ASP.NET 将返回旧脚本。所以,显然,从BundleTable.Bundles
实际上并没有做任何事情。
我可以简单地更改别名来解决这个问题,这对于开发来说是可以的,但我不喜欢这个想法,因为这意味着我必须在每次页面加载后弃用别名,或者有一个 BundleCollection 的大小在每个页面加载。如果您在生产环境中保留此功能,那将是一场灾难。
所以看起来当一个脚本被提供时,它会被缓存,独立于实际的BundleTables.Bundles
目的。因此,如果您重新使用 URL,即使您在重新使用它之前删除了它引用的包,它也会以其缓存中的内容进行响应,并更改Bundles
对象不会刷新缓存——所以仅new物品(或者更确切地说,具有不同名称的新物品)将永远被使用。
这种行为看起来很奇怪......从集合中删除某些内容应该将其从缓存中删除。但事实并非如此。必须有一种方法来刷新此缓存并让它使用当前的内容BundleCollection
而不是第一次访问该包时缓存的内容。
知道我该怎么做吗?
有这个ResetAll
方法的目的未知,但无论如何它都会破坏事情,所以不是这样。