Cache.Remove(key)之后缓存中的空值

时间:2011-10-06 10:40:33

标签: asp.net-mvc exception caching

我使用下面的GetOrStore<T>缓存助手在我的ASP.NET MVC应用程序和数据库之间添加了一个缓存层。

这包括缓存用户的系统角色。

当我通过HttpRuntime.Cache.Remove(userRoleCacheKey)删除已登录用户的缓存角色对象时,后续请求因NullReferenceException而失败,因为缓存帮助器为角色缓存返回空值,即使缓存的密钥不应该存在,助手应该重新生成它。

似乎缓存的密钥依赖于null值。在我几秒钟之后请求一个角色密集的页面之前,该异常不会让步。

为什么我的缓存会中断?

public static class CacheExtensions
{
    public static T GetOrStore<T>(this Cache cache, string key, Func<T> generator)
    {
        var result = cache.Get(key);

        if (result == null)
        {
            result = generator();
            if (result != null) // can't store null values in cache.
            {
                cache[key] = result;
            }
        }
        return (T)result;
    }
}

以下是获取用户角色并缓存它的代码:

public override string[] GetRolesForUser(string userId)
{
    return HttpRuntime.Cache.GetOrStore<string[]>(
        "RolesForUser[" + userId + "]",
        () => Con.Query<string>("SELECT Role FROM vw_UserRoles WHERE UserId = @userId", new { userId = Guid.Parse(userId)  }).ToArray());
}

其中Con检索一个开放的IDbConnection

1 个答案:

答案 0 :(得分:0)

代码中的小问题可以隐藏您的问题:

if (result != null) // can't store null values in cache.
{
    cache[key] = result;
}

else条款怎么样?无论如何返回结果,即使它是空值。在这种情况下抛出InvalidOperationException并调试以generator参数传递的查询。