添加对象后,MemoryCache为空

Big*_*ike 8 asp.net-mvc c#-4.0

我在MVC 3 ASP.NET应用程序中遇到了一个奇怪的ASP.NET MemoryCaching问题.

每次执行一个动作时,我都会检查它的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");
  } 
}
Run Code Online (Sandbox Code Playgroud)

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;
        }
Run Code Online (Sandbox Code Playgroud)

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...");
            }
       }
Run Code Online (Sandbox Code Playgroud)

代码非常简单,但有时(完全随机),只是在将LoginInfo添加到MemoryCache后,结果为空,刚添加的Object不存在,因此我得到了Exception.

我在Cassini和IIS 7上测试这个,它似乎与AppPool的可重用性无关(在IIS 7中启用),我已经测试了几个缓存策略,但无法使其工作

我错过了什么/失败了?

PS:原谅我的英语不好

Jam*_*ack 1

我相信您遇到了 Scott Hanselman 识别为 .NET 4 bug 的问题。请看这里:MemoryCache Empty : 设置后返回 null