虽然我已经指定了一个唯一的密钥,但是下面的代码似乎将为5个请求返回一个值,然后为下一个请求返回另一个值,然后恢复到原始请求中保存的值并继续直到有10个所有存储在同一个密钥下的不同对象。 然后它几乎是随机的,它将从缓存中返回这些值。

string strDateTime = string.Empty;
string cachename = "datetimeexample";
object cachedobject = HttpRuntime.Cache.Get(cachename);
if (cachedobject != null)
    strDateTime = (string)cachedobject;
else
{
    strDateTime = DateTime.Now.ToString();
    HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null);
}
Response.Write(strDateTime +"        keys:"+ HttpRuntime.Cache.Count);

非常困惑,这是因为线程还是什么?

有帮助吗?

解决方案

忽略服务器场和负载平衡的可能性,此行为可能是由作为 web-garden 。引用MSDN的相关部分:

  

因为网络花园可以使用   多个流程,每个流程都会   拥有自己的应用程序副本   状态,进程内会话状态,   缓存和静态数据。网络花园   不应该用于所有人   应用程序,尤其是在需要时   维持国家。务必   基准测试的表现   在决定是否之前申请   Web园模式是合适的。

这将使其看起来好像缓存为同一个密钥存储多个值,实际上在缓存中有重复的条目。

要在IIS 7中解决此问题,请打开应用程序池的高级设置并将 Maximum Workers Processes 设置为1.对于IIS 6,请参阅 MSDN文章(带漂亮的截图)。

虽然已经晚了8个月,我正在回答这个问题,因为我在找到这篇关于web-garden陷阱的好文章。希望这个答案将为未来的搜索者节省大量时间。 :)

其他提示

您的缓存密钥始终是“datetimeexample”,因此,缓存中始终有一个对象;你将永远收到那个物品。

我不太确定你在这里想要完成什么,就我而言,这完全符合它的预期。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top