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);
Очень смущен, это из-за многопоточности или чего-то такого?
Решение
Игнорируя возможность фермы серверов и балансировки нагрузки, это может быть вызвано тем, что пул приложений работает как веб-сад . Чтобы процитировать соответствующий раздел из MSDN:
Поскольку веб-сады позволяют использовать несколько процессов, каждый процесс будет иметь собственную копию заявления состояние, состояние сеанса в процессе, кеши и статические данные. Веб-сады не должен использоваться для всех приложения, особенно если они нужны поддерживать состояние. Обязательно сравнительный анализ производительности приложение, прежде чем решить, Режим веб-сада подходит.
Это заставит его выглядеть так, как если бы кеширование хранило несколько значений для одного и того же ключа, фактически имея дублированные записи в кеше.
Чтобы решить эту проблему в IIS 7, откройте Расширенные настройки пула приложений и установите для Максимальное количество рабочих процессов значение 1. Для IIS 6 см. статья MSDN (с красивые скриншоты).
Хотя и на 8 месяцев позже, я отвечаю на этот вопрос, потому что нашел его задолго до того, как нашел эта достойная статья о проблемах веб-сада . Надеюсь, этот ответ сэкономит будущим поисковикам массу времени. :) Р>
Другие советы
Ваш кеш-ключ всегда 'datetimeexample', поэтому у вас всегда будет один объект в кеше; и вы всегда получите этот объект обратно.
Я не совсем уверен, что вы пытаетесь достичь здесь, насколько я понимаю, это ведет себя именно так, как и должно быть.