我已經使用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