“集合已被修改”错误尝试枚举捆绑包中的文件

时间:2016-06-02 05:36:49

标签: c# asp.net asp.net-mvc asp.net-bundling

我在MVC页面上遇到一个棘手的错误,只有在网站上有多个用户时才会出现这个错误。

我得到的错误是

  

收藏被修改;枚举操作可能无法执行。

在尝试呈现javascript文件Bundle的行上发生错误。

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

/ app_start中的关联代码 - > BundleConfig.cs - > RegisterBundles非常标准:

bundles.Add(new ScriptBundle("~/Scripts/js").Include(
            "~/Scripts/jquery-{version}.js",
            "~/Scripts/jquery-ui-{version}.js",
            "~/Scripts/jquery.validate*",
            "~/Scripts/jQuery.Buzz/jquery.buzz.js"
        ));

当网站上同时有多个用户时,似乎只会出现错误。我设法通过在多个浏览器中创建多个选项卡并在尽可能快地点击它们来本地重现问题。

我搜索过但无法找到其他有类似错误的人。该错误意味着在循环时正在修改集合。我无法看到要添加到包中的文件集合如何在枚举集合时发生变化。

堆栈跟踪如下:

[InvalidOperationException: Collection was modified; enumeration operation may not execute.]
   System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) +56
   System.Collections.Generic.Enumerator.MoveNextRare() +14277518
   System.Web.Optimization.Bundle.EnumerateFiles(BundleContext context) +266
   System.Web.Optimization.Bundle.GenerateBundleResponse(BundleContext context) +38
   System.Web.Optimization.Bundle.GetBundleResponse(BundleContext context) +61
   System.Web.Optimization.BundleResolver.GetBundleContents(String virtualPath) +214
   System.Web.Optimization.AssetManager.DeterminePathsToRender(IEnumerable`1 assets) +410
   System.Web.Optimization.AssetManager.RenderExplicit(String tagFormat, String[] paths) +35
   ASP._Page_Views_Shared__Layout_cshtml.Execute() in c:\..\Views\Shared\_Layout.cshtml:13

错误发生时服务器没有特别重载。我在服务器上有监控软件,显示CPU和内存处于正常水平,同时产生错误。

任何可能导致此问题的想法?

更新:经过一些进一步的搜索后,我发现Bundle正在控制器中以编程方式进行更新。

  BundleTable.Bundles.GetBundleFor("~/Scripts/js").Include("~/Scripts/jquery.mobile-{version}.js");

事实证明这不需要以编程方式添加,所以我将它包含在BundleConfig文件中,该网站似乎现在正在运行。

1 个答案:

答案 0 :(得分:0)

尝试将此添加到app_start

下的捆绑配置文件中
public static void RegisterBundles(BundleCollection bundles) {
        bundles.Add(new ScriptBundle("~/bundles/js1").Include("~/js/jquery-1.8.3.min.js","~/js/jquery-ui.js"));
    }

“〜/ bundles / js1”是捆绑包的名称。

在您的视图中

添加此行,将脚本渲染到视图中。

@System.Web.Optimization.Scripts.Render("~/bundles/js1")

应该可以正常运行...只是不要忘记更改包含的js文件名和包的名称