2015-04-03 4 views
16

Wir haben diesen Fehler sehr häufig in einer Anwendung MVC 5.1.3 auftreten, wenn es passiert, muss der Benutzer die Seite aktualisieren und es funktioniert nicht, so dass es ein intermittierendes Problem ist.MVC Action Filters Collection wurde geändert; Enumerationsvorgang möglicherweise nicht ausgeführt

Wir fanden es schwierig zu diagnostizieren, wie es scheint, innerhalb des Rahmens selbst zu geschehen. Irgendwelche Ideen, wo Sie suchen?

Dies ist der vollständige Stapel:

System.InvalidOperationException: Collection was modified; enumeration operation may not execute. 
    at System.Collections.Generic.List`1.Enumerator.MoveNextRare() 
    at System.Web.Mvc.FilterProviderCollection.GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    at System.Web.Mvc.ControllerActionInvoker.GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) 
    at System.Web.Mvc.Controller.<BeginExecuteCore>b__1c(AsyncCallback asyncCallback, Object asyncState, ExecuteCoreState innerState) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
    at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TState](AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) 
    at System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
    at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TState](AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) 
    at System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) 
    at System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__4(AsyncCallback asyncCallback, Object asyncState, ProcessRequestState innerState) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
    at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TState](AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) 
    at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Es gibt eine ähnliche Frage vor gefragt war: Collection was modified; enumeration operation may not execute, aber dies durch ein Upgrade auf MVC 5, wir bereits auf 5.

+0

Auf welchen Code bekommen Sie das? – Mairaj

+4

Offensichtlich fügt oder entfernt etwas zur Laufzeit einen Filter aus Ihrer globalen Filtersammlung. Dies ist etwas, das nur beim Start passieren sollte, also sollten Sie zuerst nach einem Ort suchen, an dem die globalen Filter geändert werden, und an einem anderen Ort, an dem das geschieht, das nicht im Start ist, ist verdächtig. –

+0

Haben Sie noch andere Tools verwendet, um besser zu sehen, was passiert? wie [Elmah] (https: // github.com/alexbeletsky/elmah-mvc) oder [Einblick] (http://getglimpse.com/) –

Antwort

4

Als @Erik aufgelöst wurde sagte in einem Kommentar, offensichtlich die Sammlung von Filtern wird während die Ausführung der Anfragen geändert, wo es nur während des Start der Anwendung gefüllt werden sollte.

Eine Möglichkeit ist, dass Sie eine benutzerdefinierte IFilterProvider registriert haben, die den Code bricht. Hier ist der Quellcode aus dem der Fehler auftritt (von FilterProviderCollection)

 for (int i = 0; i < providers.Length; i++) 
     { 
      IFilterProvider provider = providers[i]; 
      foreach (Filter filter in provider.GetFilters(controllerContext, actionDescriptor)) 
      { 
       filters.Add(filter); 
      } 
     } 

Die provider.GetFilter(...) ein List Rückkehr, die später während der Enumeration in den FilterProviderCollection ‚s foreach Block modifiziert ist.

Hier ist, was für Sie zu Test meiner Meinung nach kommt:

  • Zunächst einmal sicherstellen, dass Sie nicht eine benutzerdefinierte IFilterProvider (entweder Sie oder eine Bibliothek, die Sie verwenden können) Registrierung. Wenn ja, ist das der Hauptverdächtige.

  • Suchen Sie nach allen Verwendungen von GlobalFilterCollection und GlobalFilters Klasse in Ihrem Code. Jede Änderung dieser Sammlung sollte nur von Application_Start in Global.asax oder der Startup Klasse erreicht werden (wenn Sie mit OWIN)

  • sucht nach Hinweisen, wo Sie erstellen Filter oder den Zugriff auf sie.

  • Versuchen Sie, auf MVC 5.2 zu aktualisieren. Wenn es sich um ein Problem mit dem Framework handelt (was unwahrscheinlich erscheint), kann dies das Problem beheben. (Ich verwende 5.2.2.0 und sehe keine ähnlichen Probleme in Entwicklung oder Produktion)

  • Debuggen Sie Ihre Anwendung, und legen Sie einen Anfangspunkt Application_BeginRequest und in der Controller-Aktion. Versuchen Sie, die globale Filtersammlung zu überprüfen und festzustellen, ob sich Änderungen ergeben haben.

  • Vielleicht kann es hilfreich sein, eine benutzerdefinierte IFilterProvider zu registrieren und das Verhalten durch Debugging oder Logging zu untersuchen.