如何在ASP.NET WebApi2中管理缓存?

Nil*_*agh 7 c# iis caching asp.net-web-api2

我使用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;  
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我的问题是关于缓存的不一致行为.

当客户端发送同步调用时,它将产生不一致的结果.对于某些请求,客户端获取正确的数据,对于某些请求,客户端在某些请求后获取空数据替代.

我添加了调试器并监视对象的null结果,然后"memoryCache.Get("SessionCollection")"也为null.经过一些连续的请求后,它将再次成功.我不明白为什么这个对象不是持久的.

另外,我也试过"HttpContext.Current.Application ["SessionCollection"]",但同样的问题就在那里.

我读过"app pool recycle",它在微粒时间后回收所有缓存.如果我的缓存对象被app pool recycle回收,那么我该如何再次获取此对象?

请一些人帮我解决这个问题.提前致谢.

all*_*tej -1

请注意,MemoryCache 会将数据保存在单个服务器的内存中。因此,如果您有多个 Web 服务器(在负载均衡器前面),则该缓存将不可用于其他服务器。您还可以使用缓存名称 - “SessionCollection”。该数据将共享给所有客户。如果需要在每个客户端的缓存中存储唯一的数据,则需要向客户端返回一个令牌(guid),并使用该令牌在后续请求中获取/更新缓存中的数据。

尝试引入类级别变量。所以你的代码将如下所示。(为了清晰起见,删除了一些代码)

private readonly MemoryCache _memCache = MemoryCache.Default;
Run Code Online (Sandbox Code Playgroud)

....

return _memCache.Get("SessionCollection") as List<Session>;
Run Code Online (Sandbox Code Playgroud)

...

_memCache .Add("SessionCollection", value, DateTimeOffset.UtcNow.AddHours(5));
Run Code Online (Sandbox Code Playgroud)