3

我在 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 文件中,并且该站点现在似乎正在运行。

4

1 回答 1

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 文件名和包的名称

于 2016-06-02T06:12:58.930 回答