C# namevaluctionCollection.Add()中的IndexOutoforGeException错误?
我有一个奇怪的例子,当我尝试向应用程序添加数据或对其进行迭代时,偶尔会有一个NameValueCollection实例崩溃。这是一个MVC5应用程序,我在IIS上托管,所讨论的代码是从Razor视图页面(.cshtml)调用的。以下是代码+堆栈跟踪:C# namevaluctionCollection.Add()中的IndexOutoforGeException错误?,c#,razor,asp.net-mvc-5,C#,Razor,Asp.net Mvc 5,我有一个奇怪的例子,当我尝试向应用程序添加数据或对其进行迭代时,偶尔会有一个NameValueCollection实例崩溃。这是一个MVC5应用程序,我在IIS上托管,所讨论的代码是从Razor视图页面(.cshtml)调用的。以下是代码+堆栈跟踪: // 'slides' is a static list of image related data. if (slides != null && slides.Count >= 1) { // Splat! Som
// 'slides' is a static list of image related data.
if (slides != null && slides.Count >= 1)
{
// Splat! Sometimes this crashes...
Model.CustomMetadata.Add("og:image", slides[0].Path);
}
消息:索引超出了数组的边界 堆栈跟踪:
在System.Collections.ArrayList.Add(对象值)
位于System.Collections.Specialized.NameValueCollection.Add(字符串名称,字符串值) 这里是代码中的另一个地方,我也会有奇怪的、断断续续的行为:
@foreach (var m in Model.CustomMetadata.AllKeys)
{
// This also seems strange since I am iterating over the keys, but getting IndexOutOfRangeException...
<meta property="@m" content="@Model.CustomMetadata[m]" />
}
@foreach(Model.CustomMetadata.AllKeys中的var m)
{
//这似乎也很奇怪,因为我正在迭代键,但得到IndexOutOfRangeException。。。
}
当这个问题发生时(间歇地,在每天重新启动IIS服务器之后),我通过在IIS中手动重新启动应用程序来解决它。在那之后,一切正常,直到下一次重启结束
以前是否有人经历过这种情况,或者可能知道罪魁祸首是什么?您有线程安全问题
NameValueCollection
。可动态调整大小。可能是您在调整大小时恰好点击了
.Add()
方法。访问.AllKeys
时也会发生同样的情况
这并不难做到:
一个对服务器的请求试图向集合添加内容,另一个请求试图调整集合的大小
作为替代方案,您可以使用类似或更合适的名称空间集合。幻灯片从何而来?@haim770“slides”只是包含图像数据的POCO的一个实例。正如您所看到的,我确保它是非空的,并且包含数据(确实如此)?显示更多的代码,特别是在幻灯片定义的地方。路径有值吗?@DetectivePikachu,是的,有值。我不确定这是否是问题所在。此集合是根据请求创建的,这是访问其成员的唯一位置。从集合中不会删除任何内容,只会添加内容,然后进行迭代。添加内容仍然需要调整大小。@A.R.上面,您说过,“'slides'是一个静态列表”。如果您的意思是
slides
在您的类中定义为private static NameValueCollection slides
,那么线程安全肯定是个问题。@howcheng Model.CustomMetadata是导致异常的NameValueCollection(每个请求构造),slides是POCO类型的静态列表。静态是指在应用程序的生命周期内保持不变。它永远不会被修改。@DetectivePikachu可能是这样,但引发异常的成员没有从多个线程访问。