Httpruntime缓存键不是唯一的?
题
虽然我已经指定了一个唯一的密钥,但是下面的代码似乎将为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”,因此,缓存中始终有一个对象;你将永远收到那个物品。
我不太确定你在这里想要完成什么,就我而言,这完全符合它的预期。
不隶属于 StackOverflow