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

Tom*_*son 69 asp.net bundle bundling-and-minification asp.net-optimization

我正在尝试使用ASP.NET MVC 4应用程序进行ASP.NET Bundling.情况是我想制作一个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"));
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,即使我更改原始js文件后,捆绑包也不会更新.当我刷新浏览器时,我继续获得304 Not Modified,并且不会更新缩小文件的内容.如何更新捆绑包,因为捆绑旧内容是没用的?我尝试了各种方法,但无法找到解决方案.

提前致谢!

nia*_*her 80

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

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

我的捆绑代码是这样的:

bundles.Add(new StyleBundle("~/css/main").Include("~/content/main.css"));
Run Code Online (Sandbox Code Playgroud)

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

<link href="/css/main?v=6Xf_QaUMSlzHbXralZP7Msq1EiLTd7g1vId6Vcy8NJM1" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

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

但是一旦我删除main.min.css,一切都开始工作得很好.更多扮演的是一个我发现,如果有两个main.cssmain.min.css,然后更新main.min.css,实际上会更新捆...怪诞,但至少可以预测的.

  • [documentation](http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification)捆绑框架遵循几个常见的约定,例如:选择".min"文件,以便在"FileX"时发布. min.js"和"FileX.js"存在.选择非".min"版本进行调试.忽略仅由IntelliSense使用的"-vsdoc"文件(例如jquery-1.7.1-vsdoc.js). (24认同)

Bol*_*olo 33

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

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

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

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

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

笔记

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


Gle*_*eno 9

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

编辑

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

Scripts.Render("/js/script")
Run Code Online (Sandbox Code Playgroud)

替代

Scripts.Render("~/js/script")
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,它有时会起作用,有时它也没有这样的事情.


coo*_*les 5

请注意,如果您使用的是Google Chrome浏览器,则缓存会非常激进。为确保不缓存任何内容,您可以调出Ctrl-Shift-I开发人员面板。转到Network并单击Disable Cache。确保您保持打开状态。现在刷新页面。您的缓存应清除,文件更改应立即反映出来。

禁用谷歌浏览器中的缓存


Hao*_*ung 1

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

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

您能否添加一些有关如何呈现对捆绑包的引用的详细信息?您是否使用类似 Scripts.Render("~/Scripts/plugin/pluginjs") 的东西?

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

Good: <script src="/fbt/bundles/js?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"></script>
Run Code Online (Sandbox Code Playgroud)

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

Not good: <script src="/fbt/bundles/js></script>
Run Code Online (Sandbox Code Playgroud)