asp.Net   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了asp.net-mvc – MVC动作过滤器集合已修改;枚举操作可能无法执行大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我们在MVC 5.1.3应用程序中发生这个错误非常频繁,如果发生这种情况,用户必须刷新该页面,并且它会消失,所以它是间歇性的问题。

我们发现诊断似乎很难在框架本身内发生。任何想法在哪里看?

这是完整的堆栈:

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,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,SynchronizationContext callBACkSyncContext)
   at System.Web.Mvc.Controller.beginExecute(requestContext requestContext,Object statE)
   at System.Web.Mvc.MvcHandler.<BeginProcessrequest>b__4(AsyncCallBACk asyncCallBACk,ProcessrequestState innerStatE)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallBACk callBACk,SynchronizationContext callBACkSyncContext)
   at System.Web.Mvc.MvcHandler.beginProcessrequest(httpContextBase httpContext,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,但这是通过升级到MVC 5解决的,我们已经在5。

解决方法

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

一种可能性是您已经注册了一个定制的IFilterProvider,它打破了代码。这里是发生错误的源代码(来自FilterProviderCollection)

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,稍后在FilterProviderCollection的foreach块中枚举中进行修改。

这是我想到的测试:

>首先,确保你没有注册一个自定义的IFilterProvider(你或者你可能正在使用的一个库)。如果是这样,那就是主要嫌犯。>在代码中查找GlobalFilterCollection和GlobalFilters类的所有用法。对此集合的任何修改只能从Global.asax中的Application_Start或启动类(如果您使用OWIN)>寻找您创建过滤器或访问它们的线索。>尝试升级到MVC 5.2。如果这是框架的一个问题(似乎不太可能),这可能会解决它。 (我使用5.2.2.0,在开发或生产中没有看到任何类似的问题)>调试您的应用程序,并在Application_Beginrequest和控制器操作的开头设置一个断点。尝试检查全局过滤器集合,看看是否有任何更改。>也许注册一个自定义IFilterProvider并通过调试或日志检查行为可能会有所帮助。

大佬总结

以上是大佬教程为你收集整理的asp.net-mvc – MVC动作过滤器集合已修改;枚举操作可能无法执行全部内容,希望文章能够帮你解决asp.net-mvc – MVC动作过滤器集合已修改;枚举操作可能无法执行所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。