【发布时间】:2017-01-24 07:57:57
【问题描述】:
我已经使用 WebAPI2 实现了 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;
}
}
}
}
我的问题是关于缓存的不一致行为。
当客户端发送同步调用时,它会给出不一致的结果。对于某些请求,客户端会获得正确的数据,而对于某些请求,客户端会在某些请求后获得空数据替代。
我已添加调试器并监视对象是否为空结果,然后 "memoryCache.Get("SessionCollection")" 也为空。经过一些连续的请求后,它将再次正确。我不明白为什么这个对象不是持久的。
替代方案,我也尝试过 "HttpContext.Current.Application["SessionCollection"]",但同样的问题也存在。
我读过“应用程序池回收”,它会在特定时间后回收所有缓存。如果我的缓存对象被app pool recycle回收了,那我怎样才能再次得到这个对象呢?
请一些人可以帮助我摆脱这个问题。提前致谢。
【问题讨论】:
-
只是想再次检查您的服务器时间是否也设置为 UTC。超时值是否可能在您预期之前实际达到?
-
顺便说一句,MemoryCache 是线程安全的,因此不需要锁定
-
您使用哪个 .NET 版本?
-
@RAM 我正在使用 .Net 框架 4.0。 .Net framework 4.5 能帮我解决这个问题吗?
-
我刚刚用更多信息更新了我的答案。另请检查您是否在 IIS 中将应用程序部署为多个工作进程。但是无论如何都不建议在本地存储
Cache
标签: c# caching iis asp.net-web-api2