虽然我已经指定了一个唯一的密钥,但是下面的代码似乎将为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);
非常困惑,这是因为线程还是什么?
答案 0 :(得分:2)
忽略服务器场和负载平衡的可能性,此行为可能是由作为web-garden运行的应用程序池引起的。引用MSDN的相关部分:
因为网络花园可以使用 多个流程,每个流程都会 拥有自己的应用程序副本 状态,进程内会话状态, 缓存和静态数据。网络花园 不应该用于所有人 应用程序,尤其是在需要时 维持国家。务必 基准测试的表现 在决定是否之前申请 Web园模式是合适的。
这将使其看起来好像缓存为同一个密钥存储多个值,实际上在缓存中有重复的条目。
要在IIS 7中解决此问题,请打开应用程序池的高级设置并将最大工作进程设置为1.对于IIS 6,请参阅MSDN article(有漂亮的截图)。
虽然已经晚了8个月,但我正在回答这个问题,因为我在找到this decent article on web-garden gotchas之前很久就找到了这个问题。希望这个答案将为未来的搜索者节省大量时间。 :)
答案 1 :(得分:0)
您的缓存密钥始终是“datetimeexample”,因此,缓存中始终有一个对象;你将永远收到那个物品。
我不太确定你在这里想要完成什么,就我而言,这完全符合它的预期。