我使用下面的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
。
答案 0 :(得分:0)
代码中的小问题可以隐藏您的问题:
if (result != null) // can't store null values in cache.
{
cache[key] = result;
}
else
条款怎么样?无论如何返回结果,即使它是空值。在这种情况下抛出InvalidOperationException
并调试以generator
参数传递的查询。