Dan*_*Dan 16 collections asp.net-mvc action-filter
我们在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, 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)
Run Code Online (Sandbox Code Playgroud)
之前有一个类似的问题:收集被修改; 枚举操作可能无法执行,但这是通过升级到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);
}
}
Run Code Online (Sandbox Code Playgroud)
provider.GetFilter(...)返回 a ,稍后在's块List中的枚举过程中对其进行修改。FilterProviderCollectionforeach
这是我想到的供您测试的内容:
首先,确保您没有注册自定义IFilterProvider(无论是您还是您可能正在使用的库)。如果是这样,那就是主要嫌疑人。
在代码中查找GlobalFilterCollection和class 的所有用法。对此集合的任何修改只能从Global.asax 或类中GlobalFilters进行(如果您使用的是 OWIN)Application_StartStartup
寻找创建过滤器或访问过滤器的线索。
尝试升级到 MVC 5.2。如果这是框架的问题(这似乎不太可能),这可能会解决它。(我使用的是 5.2.2.0,在开发或生产中没有看到任何类似的问题)
Application_BeginRequest调试您的应用程序,并在控制器操作的开头和内部设置断点。尝试检查全局过滤器集合并查看是否有任何变化。
也许注册自定义IFilterProvider并通过调试或日志记录来检查行为会有所帮助。
| 归档时间: |
|
| 查看次数: |
557 次 |
| 最近记录: |