我已经使用 Web API 2 实现了 REST 服务,该服务的实现是为了管理由访问服务的不同客户端创建和加入的不同会话。
会话包含有关应用程序功能访问的信息以及已加入同一会话的参与者的信息。
每个客户端每秒从服务器获取会话信息和访问列表以进行同步。根据访问权限的更改,客户端功能将发生更改(启用/禁用)。
我正在使用 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;
}
}
}
}
我的问题是关于缓存行为不一致。
当客户端发送同步调用时,会给出不一致的结果。对于某些请求,客户端会获取正确的数据,而对于某些请求,客户端会在某些请求后获取空数据替代。
我添加了调试器并监视对象的空结果,然后“内存缓存.Get(“SessionCollection”)”也为空。经过一些连续的请求后,它会再次正常。我不明白为什么这个对象不持久。
替代方案,我已经尝试过“HttpContext.Current.Application[“SessionCollection”]”也是,但同样的问题也存在。
我读过关于“应用程序池回收”,它会在特定时间后回收所有缓存。如果我的缓存对象被应用程序池回收回收,那么我怎样才能再次获取这个对象?
请有人可以帮助我摆脱这个问题。提前致谢。