74

我正在尝试 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 Not Modified,并且缩小文件的内容没有更新。我怎样才能使包更新,因为旧内容的包是没用的?我尝试了各种方法,但无法找到解决方案。

提前致谢!

4

15 回答 15

86

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

  • ~/内容/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实际上会更新捆绑包......很奇怪,但至少是可以预测的。

于 2012-11-07T07:58:45.687 回答
34

在努力弄清楚包缓存刷新的原因之后,我得出了一些希望对其他人有所帮助的结论:

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

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

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

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

笔记

  • 调试模式是指 web.config 编译 debug = true (和 BundleTable.EnableOptimizations = false 或被省略)
  • 发布模式是指 web.config 编译 debug = false (和 BundleTable.EnableOptimizations = true 或被省略
  • 确保您实际上是在进行代码更改。空格和注释之类的更改不会影响生成的缩小 js,因此服务器是正确的,因为没有更改(因此不刷新捆绑缓存)。
于 2015-12-11T21:27:17.607 回答
11

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

在谷歌浏览器中禁用缓存

于 2017-01-04T20:26:59.713 回答
9

好的,这是我的故事。我禁用了 Web Essentials 中较少文件的最小文件生成。旧的 min 文件没有被删除,并且 bundle thingy 看到的是那些而不是更新的 CSS。祝你好运!

编辑

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

Scripts.Render("/js/script")

替代

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

无论出于何种原因,它有时会奏效,有时却没有。

于 2013-06-27T12:18:58.663 回答
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 上的所有文件。

于 2012-08-29T07:57:57.343 回答
3

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

我不得不在我的 BundleConfig.cs 中更改一行:

bundles.Add(new StyleBundle("~/Content/css").Include(
    "~/Content/bootstrap.css",
    "~/Content/Site.css"));  <-- Uppercased.
于 2017-02-06T20:34:57.497 回答
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>
于 2012-08-28T20:22:05.017 回答
0

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

在我的情况下,违反 css 选择器规则是 -

#globalSearch.searching { ... }

如果我做这个

.searching { ... }

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

于 2014-04-16T17:23:55.973 回答
0

我知道自从更新以来已经有一段时间了,但我发现我只需要等待几秒钟就可以让包赶上我的 css 更改。我将引导程序较少的文件编译成 css 和 min.css,而且绝对不能立即看到我的更改。对我来说,在带有 ssd 的快速电脑上大约需要 10 秒。您的里程可能会因您的系统规格而异。

于 2013-02-27T16:19:52.453 回答
0

只需通过 NuGet 更新您的 System.Web.Optimization 在此处输入图像描述

在此处输入图像描述

于 2015-01-04T23:54:33.860 回答
0

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

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

BundleTable.EnableOptimizations = true;
于 2019-11-22T19:56:18.893 回答
0

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

于 2016-12-29T21:28:31.330 回答
0

我今天遇到了这个问题,我浏览了所有答案,但这里的任何解决方案都没有解决我的问题。后来我发现这是因为我的 CSS 中有错误。其中一个 url 未关闭(缺少最后一个单引号)。

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

如果您在 2020 年发生这种情况,请尝试确保您的 CSS 没有语法错误。

于 2019-12-28T08:03:44.040 回答
0

对于它的价值,我刚才遇到了同样的问题,一个 js 文件无论如何都莫名其妙地拒绝更新(重建、强制清除缓存等)。过了一会,我打开IE中的客户端调试工具(F12)开始观察网络流量,仅此行为就强制刷新JS文件。去看看,但它奏效了。

于 2016-12-08T11:36:49.833 回答
0

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

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

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

于 2017-07-13T16:25:14.780 回答