asp.net-mvc collections action-filter

asp.net mvc - Se modificó la colección de filtros de acción MVC; operación de enumeración no puede ejecutar



asp.net-mvc collections (1)

Como @Erik dijo en un comentario, obviamente la colección de filtros se está modificando durante la ejecución de las solicitudes, donde solo debe completarse durante el inicio de la aplicación.

Una posibilidad es que haya registrado un IFilterProvider personalizado que está rompiendo el código. Aquí está el código fuente de donde ocurre el error (de FilterProviderCollection )

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

El provider.GetFilter(...) está devolviendo una List que se modifica posteriormente durante la enumeración en el bloque foreach del FilterProviderCollection .

Esto es lo que me viene a la mente para que lo pruebes:

  • En primer lugar, asegúrese de no registrar un IFilterProvider personalizado (ya sea usted o una biblioteca que pueda estar usando). Si es así, ese es el principal sospechoso.

  • Busque todos los usos de las GlobalFilterCollection y GlobalFilters en su código. Cualquier modificación de esta colección solo debe ser alcanzada desde Application_Start en Global.asax o la clase de Startup (si está usando OWIN)

  • Busca pistas donde estés creando filtros o accediendo a ellos.

  • Intente actualizar a MVC 5.2. Si se trata de un problema con el marco (lo que parece poco probable), esto puede solucionarlo. (Estoy usando 5.2.2.0 y no veo ningún problema similar ni en el desarrollo ni en la producción)

  • Depure su aplicación y establezca un punto de interrupción al comienzo de Application_BeginRequest y en la acción del controlador. Intente inspeccionar la colección de filtros globales y ver si hay algún cambio.

  • Tal vez sea útil registrar un IFilterProvider personalizado e inspeccionar el comportamiento mediante la depuración o el registro.

Tenemos un error que ocurre con mucha frecuencia en una aplicación MVC 5.1.3, cuando sucede, el usuario tiene que actualizar la página y la elimina, por lo que es un problema intermitente.

Hemos encontrado que es difícil de diagnosticar, ya que parece suceder dentro del propio marco. ¿Alguna idea sobre dónde buscar?

Esta es la pila completa:

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)

Se ha hecho una pregunta similar antes: se modificó la colección; la operación de enumeración puede no ejecutarse , pero esto se resolvió actualizando a MVC 5, ya en 5.