NET 捆绑-捆绑包不更新后,包含的文件已经改变(返回304没有修改)

我正在试用 ASP.NET MVC 4应用程序的 ASP.NET 绑定。这种情况是,我想使一个 CDN 样式的服务,其中有 JS 和 CSS 文件,您可以从其他网站的地址与这种类型的地址: http://www.mycdn.com/scripts/plugin/js,其中捆绑和缩小所有包括。JS 文件。

我对一个文件的 bundle 配置如下:

bundles.Add(new ScriptBundle("~/Scripts/plugin/pluginjs").Include("~/Scripts/plugin/jquery.plugin.js"));

但是,当我这样做时,即使我更改了原始的 js 文件,bundle 也没有得到更新。当我刷新浏览器时,我继续得到304未修改,并且缩小文件的内容没有更新。我如何使捆绑包更新,因为它是无用的捆绑包与旧的内容?我尝试了所有的方法,但是没有找到一个解决办法。

先谢谢你!

66937 次浏览

我不确定目前的特性是否真的支持 CDN,因为它隐式地依赖 URL 来包含散列码以防止浏览器缓存。

但是我可以尝试帮助你达到这个目标,也许今天就可以实现... ... 一个潜在的障碍是 BundleHandler 会在包含 IfLastAmendment 头部的任何 bundle 请求上返回304,因为假设浏览器缓存总是有效的,这是由于 URL 中的指纹。

您能添加一些关于如何呈现对捆绑包的引用的细节吗?你在使用脚本之类的东西吗。渲染(“ ~/Scripts/plugin/pluginjs”) ?

您的 bundle script 标记应该类似于下面这样:

Good: <script src="/fbt/bundles/js?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"></script>

如果您的 script 标记引用的是没有版本字符串的原始捆绑包,这可能解释了您正在看到的缓存问题:

Not good: <script src="/fbt/bundles/js></script>

我其实决定不用 System 了。韦伯。对这个任务进行优化,但是我找到了 Microsoft Ajax Minifier,它也包含在 MVC4 System 附带的 WebGrease.dll 中。韦伯。优化库。我编写了以下函数,然后在 Application _ Start 中为每个缩小的文件调用该函数:

    public static void MinifyFile(string virtualPath)
{
string fullPath = HttpContext.Current.Server.MapPath(virtualPath);
string extension = Path.GetExtension(fullPath).ToLower();
string targetPath = fullPath.Substring(0, fullPath.Length - extension.Length) + ".min" + extension;
if(File.Exists(fullPath) == false)
{
throw new FileNotFoundException("File not found: " + fullPath);
}
string input = File.ReadAllText(fullPath);
string output;
if (extension == ".js")
{
Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
output = jsmin.MinifyJavaScript(input);
}
else if (extension == ".css")
{
Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
output = jsmin.MinifyStyleSheet(input);
}
else
{
throw new NotSupportedException(extension + " is not supported for minification.");
}
File.WriteAllText(targetPath, output);
}

现在,我的应用程序正在缩小 Application _ Start 上的所有文件。

我也有同样的问题,我有一个文件夹,里面有两个 CSS 文件:

  • ~/Content/main.css
  • ~/Content/main.min.css (在前面的手动缩小过程中预先存在)

我的捆绑代码是这样的:

bundles.Add(new StyleBundle("~/css/main").Include("~/content/main.css"));

无论我如何改变我的 main.css输出是相同的网址与相同的内容:

<link href="/css/main?v=6Xf_QaUMSlzHbXralZP7Msq1EiLTd7g1vId6Vcy8NJM1" rel="stylesheet"/>

更新捆绑包的唯一方法是重新构建我的解决方案——显然这不是最好的方法。

然而 我一删除 main.min.css,一切就开始正常工作。播放多一点我发现如果同时有 main.cssmain.min.css,那么更新 main.min.css实际上会更新捆绑... 怪异,但至少可以预测。

我知道它已经有一段时间,因为这是更新,但我发现我只需要等待几秒钟,让捆绑包赶上我的 css 的变化。我已经把 bootstrap less 文件编译成了 css 和 min.css,它绝对不会立即看到我的更改。对我来说,这是大约10秒钟的快速电脑与一个 ssd。您的里程可能会根据您的系统规格而有所不同。

好吧,我的故事是这样的。我禁用了在 Web 基本要素中为较少的文件生成 min 文件。旧的 min 文件没有被删除,捆绑包看到的是这些而不是更新的 CSS。祝你好运!

编辑

过了一段时间,我又在同一个问题上花了整整两个小时。这次是我的错,我想——我忘记了引导波浪,也就是说,我写了

Scripts.Render("/js/script")

代替。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

Scripts.Render("~/js/script")

不管是什么原因,有时候它起作用了,有时候却没有起作用。

我看到了这个答案,但这些都不适合我。 有一些 CSS 规则使得样式捆绑包失败,即使我对 CSS 文件做了修改,我也得到了相同的散列。我之前一切都很正常。

在我的例子中,违反 css 选择器规则是-

#globalSearch.searching { ... }

如果我让这一切

.searching { ... }

这一切又开始工作,我对我的 css 文件的任何改变,捆绑包哈希改变正确。 只是添加这个答案,因为它可能会帮助某人。

只需更新你的 System.Web.Optimationby NuGet enter image description here

enter image description here

在努力弄清楚是什么让捆绑包缓存刷新之后,我得出了一些结论,希望对其他人有所帮助:

如果. min 文件作为捆绑包的一部分包含在内:

  • 发布模式 + 更改 min js code = 缓存刷新
  • 发布模式 + 更改非最小 js 代码 = 无缓存刷新
  • 调试模式 + 更改 min js code = 无缓存刷新
  • 调试模式 + 更改非最小 js 代码 = 无缓存刷新

如果. min 文件不包含在捆绑包中:

  • 调试模式 + 更改 js 代码 = 无缓存刷新
  • 发布模式 + 更改 js 代码 = 缓存刷新

笔记

  • 调试模式是指 web.config 编译 debug = true (和 EnableOptimations = false 或被省略)
  • 发布模式是指 web.config 编译 debug = false (和 EnableOptimations = true 或被省略
  • 确保您实际上正在进行代码更改 和注释不会影响最终缩小的 js,因此服务器是 正确的地方在于没有更改(因此包缓存不是 更新)。

不管怎样,我刚才遇到了同样的问题,一个 js 文件莫名其妙地拒绝更新(重建,强制缓存清除等)。过了一会儿,我切换了 IE on (F12)中的客户端调试工具,开始监视网络流量,这一行为本身就迫使 JS 文件刷新。想想吧,但是成功了。

我的问题是我让小提琴手跑了。在我关闭 dit 并重新构建解决方案之后,它正在为我加载 js 文件中的更改。

请注意,如果你正在使用谷歌浏览器的缓存是相当积极的。为了确保没有缓存任何内容,您可以执行 Ctrl-Shift-I以打开开发人员窗格。转到 Network并单击 Disable Cache。确保你一直开着这个。现在刷新页面。您的缓存应该被清除,并且现在应该反映文件的更改。

Disable cache in Google Chrome

捆绑操作区分大小写。请确保文件名的大小写正确。

我不得不更改 BundleConfig.cs 中的一行:

bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/Site.css"));  <-- Uppercased.

我也有过类似的问题。在我的情况下,我在样式包中引用了一个 CSS 文件,并在 MVC 视图中引用了该包。我还在捆绑包代码中将“ EnableOptimations”标志设置为 false。

尽管如此,视图还是拒绝更新以包含新的 CSS 文件。

我的解决方案是创建一个 CSS 文件的缩小版本,并将其包含在项目中,然后它就开始工作了。我不知道为什么会出现这种情况,因为缩小后的文件没有在任何地方被引用(即使在视图更新之后) ,甚至不应该被考虑,因为代码被设置为不被优化。这很可能是捆绑功能的一个 bug (或特性)。我希望这能帮助其他遇到这个问题的人。

请确保您的应用程序真正部署在发布模式,并且您的主机正在修改设置。我有这个问题,但调查之后,我意识到我的文件并没有被捆绑。我是在发布模式下部署的,但出于某种原因(我怀疑是主机) ,我认为我的应用程序实际上是在调试中部署的。

我必须在 BundleConfig.cs 文件末尾设置以下内容以强制捆绑,这反过来又强制更新后的文件最终显示在浏览器中。

BundleTable.EnableOptimizations = true;

我今天遇到了这个问题,我找遍了所有的答案,但是我的问题并没有通过这里的任何解决方案得到解决。后来我发现这是因为我的 CSS 中有一个错误。其中一个 url 没有关闭(最后一个引号丢失)。

这导致 css 文件有一个语法错误,而且它没有为 Bundleconfig 编译。我想 Output 日志中应该有一条消息,但我没有检查。

如果这种情况在2020年发生在你身上,试着确保你的 CSS 没有语法错误。