我尝试了ASP.NET捆绑在一起ASP.NET MVC 4应用程序。 的情况是,我想打一个CDN式的服务,其中有JS和CSS文件,你可以从其他网站使用这种类型的地址地址: http://www.mycdn.com/scripts/plugin/js ,捆绑了和minifies包括所有.js文件。
我对一个文件包中的配置是这样的:
bundles.Add(new ScriptBundle("~/Scripts/plugin/pluginjs").Include("~/Scripts/plugin/jquery.plugin.js"));
然而,当我这样做,束没有得到即使我改变原来的js文件更新。 我不断获取304未修改,当我刷新我的浏览器,并缩小的文件的内容未更新。 我怎样才能让包更新,因为它是没用的,有旧的内容包? 我尝试了一切办法,但不能想出一个解决方案。
提前致谢!
Answer 1:
我只是有完全相同的问题。 我有2个CSS文件的文件夹:
- 〜/内容/的main.css
- 〜/内容/ 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
和main.min.css
,然后更新main.min.css
,实际上会更新捆...怪诞,但至少可以预测的。
Answer 2:
战斗找出是什么使我来到了一些结论,希望能帮助别人的包缓存刷新后:
如果.min文件包含作为软件包的一部分:
- 释放模式+改变分钟js代码=缓存刷新
- 释放模式+改变非分钟js代码=没有缓存刷新
- 调试模式+改变分钟js代码=没有缓存刷新
- 调试模式+改变非分钟js代码=没有缓存刷新
如果.min文件不包含作为软件包的一部分:
- 调试模式+变化的js代码=无缓存刷新
- 释放模式+变化js代码=缓存刷新
笔记
- 通过调试模式我的意思的web.config编译调试=真(与BundleTable.EnableOptimizations =假或省略)
- 通过释放模式我的意思是web.config文件编译调试=假(和BundleTable.EnableOptimizations = true或省略
- 确保你实际上是修改代码。 如空格和注释的变化,从而在没有任何更改(所以包缓存没有刷新)服务器是正确的,不影响所产生的精缩JS。
Answer 3:
好吧,这是我的故事。 我禁用一代分钟文件在网络要点少的文件。 老分钟未删除文件,并捆绑啄看到那些,而不是更新的CSS。 祝好运!
编辑
一段时间后我又花了好2个小时同样的问题。 这次是我的错,我想 - 我忘了领先的波浪线,也就是我写的
Scripts.Render("/js/script")
替代
Scripts.Render("~/js/script")
无论出于何种原因,有时工作,有时它确实没有这样的事情。
Answer 4:
请注意,如果您使用的是谷歌浏览器的缓存是相当积极。 以确保没有任何缓存,可以做到Ctrl-Shift-I
调出开发商窗格。 进入Network
,然后单击Disable Cache
。 确保你保持这种开放。 现在刷新页面。 缓存应该被清除,文件更改现在应已反映。
Answer 5:
其实,我决定不使用System.Web.Optimization这个任务,但是我发现微软的Ajax Minifier,其中也包括在WebGrease.dll,附带MVC4 System.Web.Optimization库。 我写了下面的函数,然后我打电话的Application_Start每个minified的文件:
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所有文件。
Answer 6:
此外,捆扎操作是区分大小写的。 请确保文件名具有正确的情况下。
我不得不改变线路在我BundleConfig.cs:
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/Site.css")); <-- Uppercased.
Answer 7:
我不知道该功能,因为它目前为将真正的支持是一个CDN,因为它含蓄地依靠URL包含一个散列码,以防止浏览器缓存。
但我可以试着帮你尝试到那里,也许它今天可能的...一个问题,可能潜在地一个障碍是,BundleHandler将返回上包含IfLastModified头束的任何请求304,因为假设是,浏览器缓存始终是有效的,由于在URL中的指纹。
你可以添加你如何渲染引用束的一些细节? 您是否正在使用类似Scripts.Render( “〜/脚本/插件/ pluginjs”)?
你的包脚本标签应该是这样的:
Good: <script src="/fbt/bundles/js?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"></script>
如果你的脚本标签引用没有版本字符串的原始包,这可能会解释你所看到的缓存问题:
Not good: <script src="/fbt/bundles/js></script>
Answer 8:
我知道它已经有一段时间,因为这是更新,但我发现我只需要等待几秒钟,让束赶上我的CSS变化。 我有引导少的文件被编译成一个css和min.css及其绝对不是即时看到我的变化。 对我来说,它是在与SSD快PC约10秒钟。 您的里程可能会因您的系统规格。
Answer 9:
我看到这个答案,但这些都不是我的情况。 有报道说,正在作出的样式捆绑失败,我居然也得到了相同的散列,即使我更改了CSS文件的某些CSS规则。 这一切都是正确之前为我工作。
在我的情况下,违反CSS选择规则是 -
#globalSearch.searching { ... }
如果我做了这个刚刚
.searching { ... }
这一切都重新开始工作,任何改变我做出我的CSS文件正确的捆绑哈希值发生变化。 刚加入这个答案,因为它可能帮助别人。
Answer 10:
只需通过更新您的NuGet System.Web.Optimization
Answer 11:
对于它的价值,我刚才有同样的问题与一个js文件莫名其妙地拒绝更新不管什么(重建,强迫缓存清理等)。 过了一会儿,我打开客户端的调试工具,在IE上(F12)开始观看网络流量,而这种单独行动迫使JS文件进行刷新。 去的身影,但它的工作。
Answer 12:
对我来说,问题是我有提琴手运行。 之后我关闭DIT和重建我的解决方案它装载在我的js文件的更改。
Answer 13:
我有一个类似的问题。 在我的情况,我有一个风格包中引用的CSS文件,并有该捆在我的MVC视图中引用。 我也有“EnableOptimizations”标志的包代码设置为false。
尽管这一切,认为拒绝更新,包括新的CSS文件。
我的解决方案是创建CSS文件的缩小版本,它包含在项目中,并开始工作。 我不知道为什么,这将是自该缩小的文件不被任何引用(视图更新后也),并因为代码设置为不进行优化,甚至不应该考虑这种情况。 这是最有可能的捆绑功能的错误(或功能)。 我希望这可以帮助别人遇到了这个问题。
文章来源: ASP.NET Bundling - Bundle not updating after included file has changed (returns 304 not modified)