ASP.NET捆绑 - 束不更新后包含的文件已经改变(返回304未修饰的)(ASP.NET Bund

2019-06-17 22:13发布

我尝试了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.cssmain.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)