Я сталкиваюсь со странной проблемой с ASP.NET MemoryCaching в приложении MVC 3 ASP.NET.
Каждый раз, когда выполняется действие, я проверяю, действительно ли его LoginInfo хранится в MemoryCache (кодбыл упрощен, но ядро выглядит следующим образом):
[NonAction]
protected override void OnAuthorization(AuthorizationContext filterContext) {
Boolean autorizzato = false;
LoginInfo me = CacheUtils.GetLoginData(User.Identity.Name);
if (me == null)
{
me = LoginData.UserLogin(User.Identity.Name);
CacheUtils.SetLoginInfo(User.Identity.Name, me);
}
// Test if the object is really in the memory cache
if (CacheUtils.GetLoginData(User.Identity.Name) == null) {
throw new Exception("IMPOSSIBLE");
}
}
GetLoginInfo:
public static LoginInfo GetLoginData(String Username)
{
LoginInfo local = null;
ObjectCache cache = MemoryCache.Default;
if (cache.Contains(Username.ToUpper()))
{
local = (LoginInfo)cache.Get(Username.ToUpper());
}
else
{
log.Warn("User " + Username + " not found in cache");
}
return local;
}
SetLoginInfo:
public static void SetLoginInfo (String Username, LoginInfo Info)
{
ObjectCache cache = MemoryCache.Default;
if ((Username != null) && (Info != null))
{
if (cache.Contains(Username.ToUpper()))
{
cache.Remove(Username.ToUpper());
}
cache.Add(Username.ToUpper(), Info, new CacheItemPolicy());
}
else
{
log.Error("NotFound...");
}
}
Код довольнопросто, но иногда (совершенно случайно), сразу после добавления LoginInfo в MemoryCache, это приводит к пустым результатам, только что добавленный объект отсутствует, поэтому я получил исключение.
Я тестирую это оба на Cassiniи IIS 7, похоже, не связан с возможностью повторного использования AppPool (включен в IIS 7), я протестировал несколько политик кэширования, но не могу заставить его работать
Что я пропускаю / не выполняю?
PS: прости меня за мой плохой английский