ASP.NET Bundling – 在包含的文件已经改变之后Bundle不更新(返回304没有修改)

我正在尝试使用ASP.NET MVC 4应用程序的ASP.NET绑定。 这种情况是我想要制作一个CDN风格的服务,它有JS和CSS文件,你可以通过这个types的地址从其他站点寻址到: http : //www.mycdn.com/scripts/plugin/js ,它捆绑并缩小所有包含的.js文件。

我的一个文件的configuration文件如下所示:

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

但是,当我这样做时,即使在更改原始js文件后,捆绑包也没有得到更新。 当我刷新我的浏览器,并且缩小的文件的内容不更新时,我一直在获取304未修改。 如何更新捆绑包,因为捆绑旧的内容是没用的? 我尝试了各种方式,但无法找出解决scheme。

提前致谢!

我刚刚有完全相同的问题。 我有一个包含2个CSS文件的文件夹:

  • 〜/内容/的main.css
  • 〜/ Content / main.min.css(以前的手动缩小过程已经存在)

我的捆绑代码是这样的:

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

不pipe我改变了多lessmain.css输出都是相同的内容相同的url:

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

更新包的唯一方法是重build我的解决scheme – 显然不是最好的方法。

但是,一旦我删除main.min.css ,一切都开始工作得很好。 多玩一点,我发现,如果有main.cssmain.min.css ,那么更新main.min.css实际上会更新包…古怪,但至less可以预测。

为了弄清楚是什么让bundlecaching刷新,我得出了一些结论,希望可以帮助其他人:

如果.min文件包含在软件包中:

  • 发布模式+更改min js code =caching刷新
  • 发布模式+更改非最小js代码=没有caching刷新
  • debugging模式+更改min js代码=没有caching刷新
  • debugging模式+更改非最小js代码=没有caching刷新

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

  • debugging模式+更改js代码=没有caching刷新
  • 发布模式+更改js代码=caching刷新

笔记

  • 通过debugging模式我的意思是web.config编译debugging= true(和BundleTable.EnableOptimizations = false或省略)
  • 通过释放模式我的意思是web.config编译debugging= false(和BundleTable.EnableOptimizations = true或省略
  • 确保你正在改变代码。 空格和注释等变化不会影响生成的缩小的js,因此服务器是正确的,因为没有更改(因此不会刷新包caching)。

好的,这是我的故事。 我在Web Essentials中禁用生成最less文件的最小文件。 旧分钟文件没有被删除,捆绑东西看到这些,而不是更新的CSS。 祝你好运!

编辑

有一段时间后,我花了另外两个小时在同一个问题上。 这一次,这是我的错 – 我猜 – 我忘了领先的代字,即我写的

 Scripts.Render("/js/script") 

替代

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

无论出于何种原因,有时候它是有效的,有时却没有这样的事情。

我实际上决定不使用System.Web.Optimization来完成这个任务,但是我发现了Microsoft Ajax Minifier,它也包含在WebCreate.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上的所有文件。

我不确定目前的function是否真的支持CDN,因为它隐含地依靠URL来包含哈希码以防止浏览器caching。

但是我可以试着帮你试试,也许今天有可能……一个可能成为障碍的问题是BundleHandler将在任何包含IfLastModified头的bundle请求上返回304,因为假设是由于url中的指纹,浏览器caching总是有效的。

你能添加一些关于如何渲染对这个包的引用的细节吗? 你在用Scripts.Render(“〜/ Scripts / plugin / pluginjs”)吗?

你的包脚本标签应该看起来像这样:

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

如果您的脚本标记引用了没有版本string的原始包,那么这可能会解释您所看到的caching问题:

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

请注意,如果您使用的是谷歌浏览器,caching是相当积极的。 为确保没有任何内容被caching,您可以Ctrl-Shift-I调出开发者窗格。 转到Network ,然后单击Disable Cache 。 确保你保持这个开放。 现在刷新页面。 你的caching应该被清除,文件的改变现在应该被反映出来。

在Google Chrome中停用缓存

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

我必须改变我的BundleConfig.cs中的一行:

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

我知道这是更新了一段时间,但我发现我只需要等待几秒钟,让这个包赶上我的CSS变化。 我有bootstrap较less的文件被编译成一个CSS和min.css,它绝对不是即时看到我的变化。 对于我来说,这是一个快速的电脑与SSD的10秒左右。 您的里程可能会根据您的系统规格而有所不同。

我看到了这个答案,但没有一个是我的情况。 有一些CSS规则,使样式打包机失败,我得到相同的散列,即使我对CSS文件进行了更改。 这一切对我来说都是正确的。

在我的情况违反CSSselect器规则是 –

 #globalSearch.searching { ... } 

如果我只是这样做

 .searching { ... } 

这一切都开始再次工作,任何更改,我对我的CSS文件捆绑散列正确地更改。 只是添加这个答案,因为它可能有助于某人。

只需通过NuGet更新您的System.Web.Optimization 在这里输入图像说明

在这里输入图像说明

对于它的价值,我刚才也有同样的问题,一个js文件莫名其妙地拒绝更新(重build,强制高速caching清除等)。 过了一段时间,我在(F12)的IE中切换客户端debugging工具,开始观看networkingstream量,而这种行为单独强制JS文件刷新。 去图,但它的工作。

对我来说问题是我有提琴手跑。 在closuresdit并重build我的解决scheme之后,它为我加载了js文件中的更改。

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

尽pipe如此,该视图拒绝更新以包含新的CSS文件。

我的解决scheme是创build一个缩小版本的CSS文件,并将其包含在项目中,并开始工作。 我不知道为什么会这样,因为这个缩小的文件没有被引用到任何地方(甚至在更新视图之后),甚至不应该被考虑,因为代码被设置为不被优化。 这很可能是捆绑function的错误(或function)。 我希望这可以帮助别人解决这个问题。