Hashtable插入失败。负载系数太高。 - asp.NET 4.0 MVC3

时间:2012-02-02 14:52:44

标签: asp.net-mvc asp.net-mvc-3 .net-4.0 load-balancing

我们在F5负载平衡服务器上运行了一个ASP.NET 4.0 MVC3应用程序。

我们收到了以下例外情况。我们不在我们的Web应用程序中进行多线程,但不知道F5负载平衡服务器是否可以考虑到这个等式。我们看到早期版本的.NET发生异常的位置(大多数其他帖子都涉及.NET 2.0和3.5)。有谁在.NET 4.0中遇到过这个问题?

该异常使应用程序无法使用,因为登录时无法加载页面而不会遇到异常。

其他链接已经审核过:

  

2012-02-02 06:01:42,671 [26]致命系统[(null)] - 未处理   XYZ应用程序中发生异常。   System.InvalidOperationException:Hashtable插入失败。负载系数   太高。最常见的原因是多线程写入   同时哈希表。在   System.Collections.Hashtable.Insert(Object key,Object nvalue,Boolean   添加)在System.ComponentModel.TypeDescriptor.NodeFor(类型类型,   布尔值createDelegator)at   System.ComponentModel.TypeDescriptor.GetProvider(Type type)at   System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider..ctor(类型   在System.Web.Mvc.ModelBinderDictionary.GetBinder(Type。)上输入   modelType,IModelBinder fallbackBinder)at   System.Web.Mvc.ControllerActionInvoker.GetModelBinder(ParameterDescriptor   parameterDescriptor)at   System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext   controllerContext,ParameterDescriptor parameterDescriptor)at   System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext   controllerContext,ActionDescriptor actionDescriptor)at   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext   controllerContext,String actionName)at   System.Web.Mvc.Controller.ExecuteCore()at   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
  在   System.Web.Mvc.MvcHandler<> c__DisplayClass6<> c__DisplayClassb.b__5()   在   System.Web.Mvc.Async.AsyncResultWrapper<> c__DisplayClass1.b__0()   在   System.Web.Mvc.MvcHandler<> c__DisplayClasse.b__d()   在   System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,   布尔和放大器; completedSynchronously)

从堆栈跟踪中可以看出,它并未指向代码中的特定位置,因此难以进行调试。

我们非常感谢任何防止遇到此异常的建议。

2 个答案:

答案 0 :(得分:6)

这是一个不常见的问题,但它确实发生在许多人身上(包括我在内)。它似乎与任何特定的负载阈值无关,它只是“发生”,一旦它发生,它会继续更频繁地发生,无论负载如何。
解决方案:
临时:重置IIS并交叉手指不会再发生这种情况 永久:从KB article中描述的微软获取补丁或等待.Net的下一个版本将被修复(据报道已在4.5 Beta中修复)

答案 1 :(得分:0)

查看Kim在此主题中的回复:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/172f4f77-601e-4b4f-8d98-582f8f62a98e


马特,

在.NET 2.0中,此错误几乎总是由多个线程同时修改Hashtable引起的。修复是在修改Hashtable之前插入锁,因为Hashtable不是多个writer线程安全的。另一种可能的解决方案是通过Hashtable.Synchronized使用同步包装器,但我们建议使用前者进行更精细的控制。

如果你的代码正在修改Hashtable,那就是修复。根据您提供的信息,我认为情况并非如此。您提到您在ASP 2.0网站上遇到此错误,因此这可能是由下游Hashtable调用者引起的。例如,如果调用堆栈看起来如下所示,请注意这是一个已针对最新版本修复的错误。

谢谢, 金

堆栈跟踪:在System.Collections.Hashtable.Insert(Object key,Object nvalue,Boolean add) at System.Collections.Hashtable.set_Item(Object key,Object value) 在System.ComponentModel.TypeDescriptor.CheckDefaultProvider(类型类型) 在System.ComponentModel.TypeDescriptor.NodeFor(Type type,Boolean createDelegator) 在System.ComponentModel.TypeDescriptor.GetDescriptor(Type type,String typeName) 在System.ComponentModel.TypeDescriptor.GetAttributes(Type componentType) 在System.Web.UI.meableAttribute.IsTypeThemeable(Type type) 在System.Web.UI.Control.ApplySkin(页面) 在System.Web.UI.Control.InitRecursive(Control namingContainer) 在System.Web.UI.Control.InitRecursive(Control namingContainer) 在System.Web.UI.Control.InitRecursive(Control namingContainer) 在System.Web.UI.Control.InitRecursive(Control namingContainer) 在System.Web.UI.Control.InitRecursive(Control namingContainer) 在System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)