0

我们遇到了一个间歇性问题,即配置文件,或者更具体地说,该数据中的值子集丢失到以太中。说实话,我不知道如何处理它,因为我不确定它是代码、配置、机器还是 IIS 问题。为了让您了解正在发生的事情......

我们在做什么

我们有一个包含“价格”下拉值的配置文件:

<searchForm>
<priceLowerBoundValues>
<priceLowerBoundValue>2500</priceLowerBoundValue>
<priceLowerBoundValue>5000</priceLowerBoundValue>
....
</priceLowerBoundValues>
....
</searchForm>

这些包含在名为 searchForm.config 的文件中。在 web.config 中,它们被引用为像这样的外部文件。

<searchForm configSource="Config\searchForm.config" />

我们有一个继承自 IConfigurationSectionHandler 的自定义配置处理程序。此处获取值的代码的要点。

var priceLowerBoundValueXPath = "/searchForm/priceLowerBoundValues/priceLowerBoundValue/text()";
searchFormLookups.PriceLowerBoundValues = section.SelectNodes(priceLowerBoundValueXPath).Cast<XmlNode>().Select(x => int.Parse(x.Value));

然后我们引用它的唯一地方是为视图模型构建选择列表时。它看起来有点像这样:

SearchFormConfiguration.PriceLowerBoundValues.ToSelectList((parameters.PriceLowerBound != null) ? parameters.PriceLowerBound.Value : 0)

没有对列表进行任何修改,并且使用 resharper “Find Usages” 只会带来这个单一的调用。程序中没有其他点触及这些值。

问题

间歇性发生的是我们网页上的下拉框突然只有一个值(例如价格框中的2500)。请注意,它并非完全为空,但通常大多数值都已消失。我们遇到过类似的外部配置丢失(几乎完全)的问题,它会导致整个地方的空引用错误。例如,它仍在寻找应该存在的配置,但它已从地球表面抹去。

停止网站,停止应用程序池,然后再次启动所有内容可以解决问题。这让我最初认为它可能与内存使用有关,而外部配置是它下降的第一件事,但我现在真的不确定。

还有一点需要注意。我们每天凌晨都会重新启动应用程序池。

对此的任何帮助都非常感谢,即使它只是朝着正确的方向轻推。正如我所说,我找不到任何关于从哪里开始的信息,无论是 IIS 设置还是代码。:)

4

1 回答 1

1

我知道我可能做错了什么。
线

x.PriceLowerBoundValues = section.SelectNodes(...).Cast<XmlNode>().Select(...);

基本上是 XmlNodeList 上的一个惰性枚举器。
来自 MSDN 文档:

此方法返回的 XmlNodeList 对象将有效,而基础文档保持不变。如果底层文档发生变化,可能会返回意外的结果(不会抛出异常)。

有机会the underlying document changes吗?
如果将值放入数组中,还会有问题吗?喜欢..Select().ToArray();

于 2012-10-29T04:14:45.727 回答