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


73

我正在尝试将ASP.NET与ASP.NET MVC 4应用程序捆绑在一起。情况是,我想制作一个CDN样式的服务,其中包含JS和CSS文件,您可以从其他站点使用以下类型的地址访问该文件:http : //www.mycdn.com/scripts/plugin/js,该文件包并缩小所有包含的.js文件。

我的一个文件捆绑配置如下所示:

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

但是,当我这样做时,即使更改了原始js文件,捆绑包也不会得到更新。刷新浏览器后,我不断收到“ 304未修改”的消息,并且缩小文件的内容未更新。由于具有旧内容的捆绑包没有用,我该如何更新捆绑包?我尝试了所有方法,但找不到解决方案。

提前致谢!


有关该问题的可能答案,请参见stackoverflow.com/a/34508048/1545567(即使用来自其他站点或纯HTML的捆绑软件)
Christophe Blin

触摸普通文件和缩小文件,它将重新加载它们。
Mariusz

Answers:


83

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

  • 〜/ Content / main.css
  • 〜/ Content / 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实际上会更新捆绑包...很奇怪,但至少可以预测。


26
文档捆绑框架遵循几种常见约定,例如:当存在“ FileX.min.js”和“ FileX.js”时,选择“ .min”文件进行发布。选择非“ .min”版本进行调试。忽略仅由IntelliSense使用的“ -vsdoc”文件(例如jquery-1.7.1-vsdoc.js)。
felickz 2014年

1
有关如何配置忽略列表的答案,请参见stackoverflow.com/a/14967754/682105
khellang

这解决了问题...非常好的答案...在我怪异的情况下,我还拥有main.js和main.min.remove.js(它捡起了main.min.remove.js)技术债务我打扫完之后所有其他人的香精
Egli Becerra

1
我觉得荒谬的是,Microsoft决定忽略我精心编码的捆绑软件,而只处理同一目录中包含的所有“ min”文件。如果要使用“ min”文件,请指定“ min”文件。FFS。
zerohero

34

在努力找出使包高速缓存刷新的原因后,我得出了一些结论,有望对其他人有所帮助:

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

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

如果.min文件不作为捆绑包的一部分包括在内:

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

笔记

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

如果我们以调试模式发布怎么办?这是否意味着捆绑将在生产中被破坏-始终提供重新启动IIS之后创建的首个捆绑?
布兰登

您仍然可以使用与web.config中的调试=“真”捆绑,如果你还设置BundleTable.EnableOptimizations =真
博洛

9

好的,这是我的故事。我在Web Essentials中禁用了生成最小文件的功能,减少了文件的数量。旧的min文件没有被删除,bundle看到的不是更新的CSS。祝好运!

编辑

一段时间后,我在同一问题上又花了2个小时。这次是我的错,我想-我忘了领先的波浪号,即我写了

Scripts.Render("/js/script")

替代

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

无论出于什么原因,它有时都起作用,而有时却没有这样做。


删除.min文件也为我解决了捆绑问题。就我而言,它可能是在分支之间合并之后发生的。
饭能2014年

6

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

禁用谷歌浏览器中的缓存


3

我实际上决定不使用System.Web.Optimization来完成此任务,但是我找到了Microsoft Ajax Minifier,它也包含在MVC4 System.Web.Optimization库随附的WebGrease.dll中。我编写了以下函数,然后在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上的所有文件。


因此,您没有找到任何解决方案。我遇到同样的问题,更改了css文件中的背景图像,在dev站中进行调试工作良好,公开展示后,出现了旧的背景。没有缩小文件被更新。:(
Ricker Silva

3

捆绑操作区分大小写。确保文件名大小写正确。

我必须在BundleConfig.cs中更改一行:

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

1

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

但是我可以帮助您尝试到达那里,并且可能在今天实现……一个可能成为障碍的问题是,BundleHandler将在包含IfLastModified标头的任何捆绑请求上返回304,因为假设是由于网址中的指纹,浏览器缓存始终有效。

您能否添加一些有关如何呈现对包的引用的详细信息?您是否正在使用Scripts.Render(“〜/ Scripts / plugin / pluginjs”)之类的东西?

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

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

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

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

问题在于,这是CDN类型的服务,因此它正在托管其他网站的文件,而不使用文件本身。因此,引用站点可以是任何站点,而不必是ASP.NET站点。我还发现捆绑销售具有CDN支持功能。
Tommi Gustafsson,2012年

asp.net/mvc/tutorials/mvc-4/bundling-and-minification(请参阅CDN部分)是否有可能我只是正常托管文件而没有捆绑和缩小,然后可能从其他ASP.NET站点对此进行引用使用CDN格式的文件:bundles.UseCdn = true; //启用CDN支持字符串cdnPath =“ mycdn.com/scripts/plugin/myplugin-xyzmin.js ”; bundles.Add(new ScriptBundle(“〜/ bundles / jquery”,cdnPath).Include(“〜/ Scripts / myplugin- {version} .js”));
Tommi Gustafsson,2012年

是的,如果这是一个可行的选择,那么那很可能是最好的选择,只是让ASP.NET站点使用托管捆绑软件的CDN。
郝宫

0

我知道自从更新以来已经有一段时间了,但是我发现我只需要等待几秒钟就可以让捆绑软件赶上我的CSS更改。我的引导程序较少的文件被编译为css和min.css,并且绝对不会立即看到我的更改。对我来说,使用SSD的快速PC大约需要10秒钟。您的里程可能会因系统规格而异。


0

我看到了这个答案,但这些都不是我的情况。有某些CSS规则使样式捆绑程序失败,即使我对CSS文件进行了更改,我也得到了相同的哈希值。对我来说一切都正常。

就我而言,违反CSS选择器的规则是-

#globalSearch.searching { ... }

如果我做到这一点

.searching { ... }

这一切都再次开始工作,并且我对css文件所做的任何更改都正确更改了捆绑程序哈希。只需添加此答案,因为它可能会对某人有所帮助。



0

对于它的价值,我现在遇到了一个同样的问题,一个js文件莫名其妙地拒绝进行更新(重建,强制清除缓存等)。一段时间后,我在(F12)上的IE中切换了客户端调试工具,开始监视网络流量,仅此行为就强制刷新了JS文件。去图,但它起作用。


0

对我来说,问题是我让Fiddler运行。关闭dit并重建解决方案后,它正在为我加载js文件中的更改。


0

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

尽管如此,视图还是拒绝更新以包含新的CSS文件。

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


0

确保您的应用程序确实以发布模式部署,并且您的主机摆弄了设置。我遇到了这个问题,但是经过调查,我意识到我的文件实际上并没有捆绑在一起。我当时以发布模式进行部署,但是由于某种原因(我怀疑是主机),我认为我的应用程序确实是在调试中部署的。

我必须在BundleConfig.cs文件的末尾设置以下内容来强制捆绑,这反过来又迫使更新的文件最终显示在浏览器中。

BundleTable.EnableOptimizations = true;

0

我今天遇到了这个问题,我经历了所有答案,但是这里的任何解决方案都无法解决我的问题。后来我发现发生这种情况是因为CSS发生错误。其中一个网址未关闭(缺少最后一个单引号)。

这导致css文件出现语法错误,并且没有为Bundleconfig编译。我想输出日志中会有一条消息,但是我没有检查。

如果您在2020年发生这种情况,请尝试确保CSS不会出现语法错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.