我已经使用WebAPI2实现了REST服务,该服务实现了管理由正在访问服务的不同客户端创建和加入的不同会话。如何管理ASP.NET WebApi2中的缓存?
会话包含有关应用程序功能访问的信息和已加入同一会话的参与者的信息。
每个客户端都会从服务器获取会话信息和访问列表,以便每秒钟进行同步。根据访问更改,客户端功能将改变(启用/禁用)。
我正在使用MemoryCache类将会话信息存储在WebAPI服务中,如下所示。
public static class SessionManager{
private static object objForLock = new object();
public static List<Session> SessionCollection
{
get
{
lock (objForLock)
{
MemoryCache memoryCache = MemoryCache.Default;
return memoryCache.Get("SessionCollection") as List<Session>;
// return HttpContext.Current.Application["SessionCollection"] as List<Session>;
}
}
set
{
lock (objForLock)
{
MemoryCache memoryCache = MemoryCache.Default;
memoryCache.Add("SessionCollection", value, DateTimeOffset.UtcNow.AddHours(5));
//HttpContext.Current.Application["SessionCollection"] = value;
}
}
}
}
我的问题是关于高速缓存的不一致的行为。
当客户端发送同步呼叫时,它会产生不一致的结果。对于某些请求,客户端获取正确的数据,并且对于某些请求,客户端在某些请求后获得空数据替代。
我已添加调试器并监视对象为空结果,然后“memoryCache.Get(”SessionCollection“)”也为null。经过一些连续的请求后,它会再次适当。我不明白为什么这个对象不是持久的。
另外,我试过“HttpContext.Current.Application [”SessionCollection“]”“,但同样的问题在那里。
我已阅读约“应用程序池回收”,它在微粒时间后回收所有缓存。如果我的缓存对象被应用程序池回收循环使用,那么如何再次获取此对象?
请有人可以帮助我摆脱这个问题。提前致谢。
只是想仔细检查您的服务器时间是否也设置为UTC。超时值是否有可能在你期望之前达到? – ManOVision
顺便说一句,MemoryCache是线程安全的,因此不需要锁定 –
其中。你使用的是.NET版本吗? – RAM