我正在尝试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,并且不会更新缩小文件的内容。如何更新捆绑包,因为捆绑旧内容是没用的?我尝试了各种方法,但无法找到解决方案。
提前致谢!
答案 0 :(得分:78)
我刚才遇到了同样的问题。我有一个包含2个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)
在努力弄清楚什么使捆绑缓存刷新后,我得出了一些结论,希望能帮助其他人:
答案 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
。确保你保持开放。现在刷新页面。应清除您的缓存,现在应反映文件更改。
答案 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
答案 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没有语法错误。