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