1

ASP.NETMVC4アプリケーションで次のエラーの原因を見つけようとしています。

Exception type: System.InvalidOperationException
Exception message: Collection was modified; enumeration operation may not execute

Stack trace: at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at System.Web.Mvc.MvcHandler.RemoveOptionalRoutingParameters()
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

問題は、コレクションが繰り返されているすべての(いくつかの)場所で、コレクションの構造を変更していないことです。スタックトレースには私のコードへの参照が含まれていないため、それほど役に立ちません。

私はこのテーマに関する多くの投稿を読みましたが、基本的にはそれが解決策として言及されています。誰かがそのような問題の他の解決策を知っていますか?エラーに関する詳細情報を取得する方法に関するヒントはありますか?

4

1 に答える 1

2

nrod、完全を期すために、コードを投稿するとよいでしょう。

ただし、スタックトレースから、(MVC)フレームワーク(System.Webなど)でエラーが発生していることがすでにわかります。スタックトレースが独自のコードを指している場合、問題は通常、コレクションを反復処理している間(たとえば、foreachループで)コレクションを操作(削除、追加など)することが原因です。いくつかの提案は、逆の方法で繰り返すか、コレクションで.ToList()を使用することです。以下を参照してください。 コレクションが変更されました。列挙操作が実行されない可能性があり ますコレクションが変更されました。列挙操作が実行されない場合があります-なぜですか?

ただし、スタックトレースは、問題がコードから(MVC)フレームワークへの呼び出しにあることを示しています。この種の問題は、共有カスタム実装IRouteHandler.GetHttpHandler()でインスタンスメンバー変数を使用することによって発生する可能性があります。これは、MSDNに記載されているように、インスタンスメンバーがスレッドセーフではないためです。http: //msdn.microsoft.com/en-us/library/system.web.http.webhost.httpcontrollerroutehandler%28v=vs.108%29.aspx

スタックトレースは、実際にメンバー変数を使用していることを示しています。この場合、エラーは、多数の同時呼び出しを実行するときに発生する可能性があります(実稼働環境など)。

インスタンスメンバーを使用しないようにコードをリファクタリングすることで、問題を修正できます。これは、ややモノリシックで反復的なコードにつながる可能性があります。たとえば、ローカル変数のみを使用するようにリファクタリングする場合です。ただし、これらはスレッドセーフであるため、代わりにパブリック静的メンバーまたは静的関数を使用してリファクタリングすることもできます。

この問題を自分で修正した後、新しいコードの負荷テストを常に行うのがよいと判断しました。そうしないと、これらの種類の問題は本番環境でのみ検出されます。

于 2012-12-18T09:49:37.193 に答える