Asp.net Httpruntime缓存密钥不唯一?

Asp.net Httpruntime缓存密钥不唯一?,asp.net,caching,unique,Asp.net,Caching,Unique,虽然我已经指定了一个唯一的键,但下面的代码似乎会为5个请求返回一个值,然后为下一对请求返回另一个值,然后恢复到原始请求中保存的值,并继续执行,直到有10个不同的对象都存储在同一个键下。 然后,它将从缓存返回这些值中的哪一个几乎是随机的 string strDateTime = string.Empty; string cachename = "datetimeexample"; object cachedobject = HttpRuntime.Cache.Get(cachename); if

虽然我已经指定了一个唯一的键,但下面的代码似乎会为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);

非常困惑,这是因为线程还是其他原因?

您的cachekey始终是“datetimeexample”,因此,缓存中始终有一个对象;你会一直收到那个东西


我不太确定您想在这里完成什么,就我而言,这完全是按照它应该做的方式进行的。

忽略服务器场和负载平衡的可能性,这种行为可能是由作为服务器运行的应用程序池引起的。引用MSDN中的相关章节:

因为网络花园允许使用 多个进程,每个进程将 有自己的申请副本 状态,进程中会话状态, 缓存和静态数据。网络花园 不应全部使用 应用程序,特别是在需要时 保持状态。一定要 对项目的绩效进行基准测试 在决定是否 网络花园模式是合适的

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

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);
要在IIS 7中解决此问题,请打开应用程序池的高级设置,并将最大工作进程数设置为1。对于IIS 6,请参阅(带有漂亮的屏幕截图)


尽管晚了8个月,我还是回答了这个问题,因为我早在发现之前就发现了它。希望这个答案能为未来的搜索者节省大量时间。:)

我想在后续的请求中检索我最初在第一页请求中缓存的对象。我无法重现您的问题,因为这似乎很好。我猜这应该是您的IIS设置中的一些内容。因此,您的应用程序将只添加x1键并不断检索相同的键?抱歉,这意味着datetime字符串不是键我在VS2008中创建了一个简单的网站,在那里添加了代码,所有操作都像一个符咒。您确定它使用相同的键存储多个对象吗?也就是说,您确定钥匙完全相同吗?如果密钥已经存在,
Insert
方法应该只覆盖现有对象。是的,密钥与包装在静态方法/类中的代码片段完全相同。您是在单台计算机上运行还是在服务器场上运行?