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 とメモリを通常のレベルで表示するサーバー上の監視ソフトウェアがあります。

これを引き起こしている可能性のあるアイデアはありますか?

更新: さらに検索した結果、コントローラーでバンドルがプログラムによって更新されていることがわかりました。

  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 に答える