C# asp.net MVC 4中的集合被修改错误
我正在尝试在ASP.NET MVC 4应用程序中查找以下错误的来源C# asp.net MVC 4中的集合被修改错误,c#,asp.net-mvc,collections,error-handling,C#,Asp.net Mvc,Collections,Error Handling,我正在尝试在ASP.NET MVC 4应用程序中查找以下错误的来源 Exception type: System.InvalidOperationException Exception message: Collection was modified; enumeration operation may not execute Stack trace: at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource
Exception type: System.InvalidOperationException
Exception message: Collection was modified; enumeration operation may not execute
Stack trace: at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at System.Web.Mvc.MvcHandler.RemoveOptionalRoutingParameters()
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
问题是,在迭代集合的所有(少数)地方,我都没有以任何方式更改集合结构。堆栈跟踪没有那么大帮助,因为它不包含对我的代码的任何引用
我已经读了很多关于这个主题的帖子,基本上这就是他们提到的解决方案。
有人知道解决这个问题的其他方法吗?关于如何获取有关错误的更多信息,有什么提示吗?nrod,为了完整起见,最好发布您的代码 但是,从堆栈跟踪中,我已经看到(MVC)框架(例如System.Web)中出现了错误。Í如果堆栈跟踪指向您自己的代码,则问题通常是由于在对集合进行迭代时(例如在foreach循环中)对集合进行了操作(例如删除、添加)。一些建议是以相反的方式进行迭代,或者对集合使用.ToList(),请参阅: 但是,堆栈跟踪表明问题来自代码对(MVC)框架的调用。在共享的自定义实现的IRoutHandler.GetHttpHandler()中使用实例成员变量可能会导致此类问题。这是因为实例成员不是线程安全的,如MSDN中所述: 堆栈跟踪表明您确实在使用成员变量。然后,在执行大量并发调用时(例如在生产环境中)可能会发生错误 您可以通过重构代码以不使用任何实例成员来修复此问题。这可能会导致代码过于单一和重复。例如,当重构为仅使用局部变量时。但您也可以尝试将use重构为公共静态成员或静态函数,因为它们是线程安全的
在我自己解决了这个问题之后,我决定总是对新代码进行一些负载测试,否则这些问题只能在生产中检测到 把你的代码放在这里,告诉我你尝试了什么?你有没有运行任何可能会改变值的反向线程?你必须发布代码——很可能是因为修改了闭包,或IEnumerable的延迟枚举。看起来您正在调用
字典上的ToArray
,而在ToArray
调用过程中有其他内容正在修改字典。可能的线程问题。我倾向于同意@Rawling,这一行RemoveOptionalRoutingParameters
确实指出了这一点。也许我有一些路线…谢谢你的见解。我已经在这个方向上更改了我的自定义处理程序public IHttpHandler GetHttpHandler(RequestContext RequestContext)
,似乎我已经修复了错误。。。