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

2024-05-13

... 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方法的目的未知,但无论如何它都会破坏事情,所以不是这样。


我们听到您对文档的痛苦,不幸的是这个功能仍然变化得很快,并且生成文档有一些滞后,并且几乎可以立即过时。瑞克的博客文章 http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification是最新的,我也尝试在这里回答问题,同时传播当前信息。我们目前正在建立我们的官方 Codeplex 网站,该网站将始终包含最新的文档。

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何强制 BundleCollection 刷新 MVC4 中缓存的脚本包 的相关文章

  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • string.empty 和 string[0] == '\0' 之间的区别

    假设我们有一个字符串 std string str some value is assigned 有什么区别str empty and str 0 0 C 11 及更高版本 string variable 0 如果字符串为空 则需要返回空字
  • 第一次在更新面板中自动将文件上传到服务器不起作用

    要求 我正在尝试在用户选择文件后立即上传该文件 我必须满足以下要求 该按钮看起来与应用程序中的其他按钮类似 用户选择文件后就会上传该文件 我需要它位于 UpdatePanel 中 因为我必须对页面进行有条件的更新 我CAN对所选文件进行完整
  • 我需要一个树转储选项,该选项在当前的 gcc 版本中不再存在

    旧版本的 GCC 例如 4 0 2 或 4 1 2 有该选项 df see 用于调试程序或 GCC 的选项对于4 1 2 http gcc gnu org onlinedocs gcc 4 1 2 gcc Debugging Options
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 如何从c++调用python

    我是Python新手 我尝试像这样从 C 调用 python 脚本 在 Raspberry Pi 中 std string pythonCommand python Callee py a b int res system pythonCo
  • 如何检查是否发生溢出? [复制]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • asp.net MVC ModelState.IsValid 返回 false

    我正在开发 ASP NET MVC 应用程序 我有一个视图模型如下 public class SampleInterestViewModel Properties defined One such property that shows a
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 任何浮点密集型代码是否会在任何基于 x86 的架构中产生位精确的结果?

    我想知道使用浮点运算的 C 或 C 代码是否会在任何基于 x86 的体系结构中产生位精确的结果 无论代码的复杂性如何 据我所知 自 Intel 8087 以来的任何 x86 架构都使用准备处理 IEEE 754 浮点数的 FPU 单元 并且
  • 为什么没有参数的函数(与实际函数定义相比)可以编译?

    我刚刚看到某人的 C 代码 我很困惑为什么要编译它 有两点我不明白 The 函数原型与实际函数定义相比没有参数 中的参数函数定义没有类型 include
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐