ASP.NET捆绑 - 捆绑文件更改后捆绑包不更新(返回304未修改)

时间:2012-08-28 12:10:35

标签: asp.net bundle asp.net-optimization bundling-and-minification

我正在尝试ASP.NET捆绑ASP.NET MVC 4应用程序。情况是我想制作一个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文件后,捆绑包也不会更新。当我刷新浏览器时,我继续获得304 Not Modified,并且不会更新缩小文件的内容。如何更新捆绑包,因为捆绑旧内容是没用的?我尝试了各种方法,但无法找到解决方案。

提前致谢!

15 个答案:

答案 0 :(得分:78)

我刚才遇到了同样的问题。我有一个包含2个CSS文件的文件夹:

  • 〜/内容/ main.css的
  • 〜/ Content / main.min.css(预先存在于我之前的手动缩小过程中)

我的捆绑代码是:

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

无论我改变了多少main.css,输出都是相同的url,内容相同:

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

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

然而我删除main.min.css后,一切都开始正常工作。再玩一点我发现如果同时有main.css和{{1} },然后更新main.min.css实际上会更新包...很奇怪,但至少可以预测。

答案 1 :(得分:32)

在努力弄清楚什么使捆绑缓存刷新后,我得出了一些结论,希望能帮助其他人:

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

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

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

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

备注

  • 通过调试模式我的意思是web.config编译debug = true(和 BundleTable.EnableOptimizations = false或被省略)
  • 按发布模式,我的意思是web.config编译debug = false(和 BundleTable.EnableOptimizations = true或被省略
  • 确保您实际上正在进行代码更改。空格等变化 和注释不会影响生成的缩小的js,所以服务器是 正确的是没有变化(因此捆绑缓存不是 刷新)。

答案 2 :(得分:9)

好的,这是我的故事。我在Web Essentials中为较少的文件禁用了min文件的生成。旧的min文件没有被删除,而bundle thingy看到了那些而不是更新的CSS。祝你好运!

编辑

有一段时间后,我又在同一个问题上花了2个小时。这次是我的错 - 我想 - 我忘记了领先的代字号,即我写了

Scripts.Render("/js/script")

代替

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

无论出于什么原因,它有时会起作用,有时它也没有这样的事情。

答案 3 :(得分:5)

请注意,如果您使用的是Google Chrome,则缓存非常激进。为确保不缓存任何内容,您可以Ctrl-Shift-I打开开发人员窗格。转到Network,然后点击Disable Cache。确保你保持开放。现在刷新页面。应清除您的缓存,现在应反映文件更改。

Disable cache in Google Chrome

答案 4 :(得分:3)

我实际上决定不使用System.Web.Optimization执行此任务,但我发现了Microsoft Ajax Minifier,它也包含在WebGrease.dll中,它附带了MVC4 System.Web.Optimization库。我编写了以下函数,然后我在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上的所有文件。

答案 5 :(得分:3)

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

我必须在BundleConfig.cs中更改一行:

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

答案 6 :(得分:1)

我不确定它当前的功能是否真的支持成为CDN,因为它隐含地依赖于url来包含哈希码以防止浏览器缓存。

但我可以尝试帮助您尝试实现目标,也许今天可能实现......可能存在障碍的一个问题是BundleHandler将在包含IfLastModified标头的任何捆绑请求上返回304,因为假设由于URL中的指纹,浏览器缓存始终有效。

您能否添加一些有关如何呈现捆绑引用的详细信息?您使用的是Scripts.Render(“〜/ Scripts / plugin / pluginjs”)吗?

您的捆绑脚本标记应如下所示:

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

如果您的脚本标记引用了没有版本字符串的原始包,那么这可能会解释您看到的缓存问题:

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

答案 7 :(得分:0)

我知道它已经有一段时间了,但是我发现我只需要等待几秒钟让捆绑包赶上我的css更改。我将bootstrap较少的文件编译成css和min.css,它绝对不能立即看到我的更改。对我来说,在带有ssd的快速电脑上大约需要10秒钟。您的里程可能因系统规格而异。

答案 8 :(得分:0)

我看到了这个答案,但对我来说都不是这样的。 有一些CSS规则使得样式捆绑器失败并且我得到相同的散列,即使我对CSS文件进行了更改。对我来说,这一切都正常。

在我的情况下,违反css选择器规则是 -

#globalSearch.searching { ... }

如果我这样做只是

.searching { ... }

这一切都重新开始工作,我对css文件所做的任何更改都会正确更改bundler hash。 只需添加此答案,因为它可能有助于某人。

答案 9 :(得分:0)

只需通过NuGet更新您的System.Web.Optimization enter image description here

enter image description here

答案 10 :(得分:0)

对于它的价值,我刚才遇到了同样的问题,一个js文件莫名其妙地拒绝更新,无论如何(重建,强制缓存清除等)。过了一会儿,我在IE(F12)上切换了IE中的客户端调试工具,开始观察网络流量,而这一行为迫使JS文件刷新。去图,但它奏效了。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

我有类似的问题。在我的情况下,我在样式包中引用了一个CSS文件,并在我的MVC视图中引用了该包。我也有'#34; EnableOptimizations&#34;标志在捆绑代码中设置为false。

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

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

答案 13 :(得分:0)

确保您的应用程序确实以发布模式进行了部署,并且您的主机摆弄了设置。我遇到了这个问题,但是经过调查后,我意识到我的文件实际上并未捆绑在一起。我当时以发布模式进行部署,但是由于某种原因(我怀疑是主机),我认为我的应用程序确实是在调试中部署的。

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

BundleTable.EnableOptimizations = true;

答案 14 :(得分:0)

我今天遇到了这个问题,我回答了所有问题,但是这里的任何解决方案都无法解决我的问题。后来我发现发生这种情况是因为CSS发生错误。其中一个网址未关闭(缺少最后一个单引号)。

这导致css文件出现语法错误,并且没有为Bundleconfig编译。我想输出日志中会有消息,但是我没有检查。

如果这是在2020年发生的情况,请尝试确保CSS没有语法错误。