gpt4 book ai didi

c# - 如何强制 BundleCollection 刷新 MVC4 中缓存的脚本包

转载 作者:IT王子 更新时间:2023-10-29 03:38:27 24 4
gpt4 key购买 nike

... 或 我如何学会停止担心并只针对 Microsoft 完全未记录的 API 编写代码。是否有官方 System.Web.Optimization 版本的任何实际文档?因为我肯定找不到任何东西,没有 XML 文档,而且所有的博客文章都提到了 RC API,这有很大的不同。无论如何..

我正在编写一些代码来自动解析 javascript 依赖项,并根据这些依赖项即时创建 bundle 。一切都很好,除非您编辑脚本或以其他方式进行会影响 bundle 的更改而不重新启动应用程序,这些更改将不会反射(reflect)出来。所以我添加了一个选项来禁用缓存用于开发的依赖项。

但是,显然 BundleTables 缓存了 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"

每当我删除并重新创建具有相同别名的包时,绝对没有任何反应:从ResolveBundleUrl 返回的bundleUrl 与之前相同我删除并重新创建了 bundle 。 “相同”是指内容哈希未更改以反射(reflect) bundle 的新内容。

编辑...实际上,情况比那更糟。 bundle 本身 以某种方式缓存在 Bundles 集合之外。如果我只是生成自己的随机散列以防止浏览器缓存脚本,ASP.NET 将返回旧脚本。因此,显然,从 BundleTable.Bundles 中删除一个包实际上并没有做任何事情。

我可以简单地更改别名来解决这个问题,这对开发来说是可以的,但我不喜欢这个想法,因为这意味着我必须在每次加载页面后弃用别名,或者有一个增长的 BundleCollection每个页面加载的大小。如果您在生产环境中保留此功能,那将是一场灾难。

看起来,当提供脚本时,它会独立于实际的 BundleTables.Bundles 对象进行缓存。因此,如果您重新使用一个 URL,即使您在重新使用它之前删除了它引用的包,它也会响应其缓存中的任何内容,并且更改 Bundles 对象不会刷新缓存-- 因此只会使用项(或者更确切地说,具有不同名称的新项)。

行为似乎很奇怪...从集合中删除某些内容应该将其从缓存中删除。但事实并非如此。必须有一种方法来刷新此缓存并让它使用 BundleCollection 的当前内容,而不是首次访问该包时缓存的内容。

知道我该怎么做吗?

有一个 ResetAll 方法,它的目的不明,但它无论如何都会破坏事物,所以不是这样。

最佳答案

我们听到了您对文档的不满,不幸的是,此功能仍在快速变化,并且生成文档有一些滞后,并且几乎可以立即过时。 Rick's blog post是最新的,我也尝试在这里回答问题,同时传播最新信息。我们目前正在建立我们的官方 codeplex 站点,该站点将始终提供最新文档。

现在关于如何从缓存中刷新包的具体问题。

  1. 我们使用根据请求的捆绑 url 生成的 key 将捆绑响应存储在 ASP.NET 缓存中,即 Context.Cache["System.Web.Optimization.Bundle:~/bundles/jquery"] 我们还针对用于生成此包的​​所有文件和目录设置缓存依赖项。因此,如果任何底层文件或目录发生更改,缓存条目将被刷新。

  2. 我们并不真正支持基于每个请求实时更新 BundleTable/BundleCollection。完全支持的场景是在应用程序启动期间配置 bundle (这样一切都在网络场场景中正常工作,否则如果发送到错误的服务器,一些捆绑请求最终会变成 404)。查看您的代码示例,我的猜测是您正在尝试根据特定请求动态修改 bundle 集合?任何类型的 bundle 管理/重新配置都应该伴随着 appdomain 重置,以确保一切都已正确设置。

因此,请避免在不回收您的应用程序域的情况下修改您的包定义。您可以自由修改包内的实际文件,这些文件应该会自动检测并为您的包 url 生成新的哈希码。

关于c# - 如何强制 BundleCollection 刷新 MVC4 中缓存的脚本包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12317391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com