首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MVC操作筛选器集合已修改;枚举操作可能无法执行

MVC操作筛选器集合已修改;枚举操作可能无法执行
EN

Stack Overflow用户
提问于 2015-04-03 17:27:43
回答 1查看 640关注 0票数 16

在MVC 5.1.3应用程序中,这个错误经常发生,当它确实发生时,用户必须刷新页面,它就会消失,所以这是一个间歇性的问题。

我们发现它很难诊断,因为它似乎发生在框架本身。你知道该去哪里找吗?

这是完整的堆栈:

代码语言:javascript
复制
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)

以前也有过类似的问题:Collection was modified; enumeration operation may not execute,但这个问题已经通过升级到MVC5解决了,我们已经在MVC5上了。

EN

回答 1

Stack Overflow用户

发布于 2015-04-21 15:07:14

正如@Erik在一条评论中所说的,很明显,过滤器集合在请求的执行期间被修改,它应该只在应用程序启动时被填充。

一种可能是你注册了一个自定义的IFilterProvider,这破坏了代码。以下是发生错误的源代码(来自FilterProviderCollection)

代码语言:javascript
复制
        for (int i = 0; i < providers.Length; i++)
        {
            IFilterProvider provider = providers[i];
            foreach (Filter filter in provider.GetFilters(controllerContext, actionDescriptor))
            {
                filters.Add(filter);
            }
        }

provider.GetFilter(...)返回一个List,稍后在FilterProviderCollectionforeach块中枚举时会对其进行修改。

下面是我想让你测试的东西:

  • 首先,确保您没有注册自定义的IFilterProvider (无论是您自己,还是您可能正在使用的库)。如果是这样,那么它就是代码中GlobalFilterCollectionGlobalFilters类所有用法的主要suspect.
  • Look。对此集合的任何修改都只能从Global.asax中的Application_StartStartup类(如果您使用OWIN)
  • 查找您在何处创建或访问筛选器的线索。
  • 尝试升级到MVC5.2。如果这是框架的问题(这似乎不太可能),这可能会解决它。(我使用的是5.2.2.0,在开发或production)
  • Debug您的应用程序时没有看到任何类似的问题,并在Application_BeginRequest的开头和控制器操作中设置了一个断点。尝试检查全局筛选器集合,并查看是否有注册自定义IFilterProvider的change.
  • Maybe,通过调试或日志记录检查行为可能会有所帮助。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29429526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档