Tôi đã triển khai dịch vụ REST bằng WebAPI2, dịch vụ được triển khai để quản lý các phiên khác nhau được tạo và tham gia bởi các máy khách khác nhau đang truy cập dịch vụ.Làm cách nào để quản lý bộ nhớ cache trong ASP.NET WebApi2?
Phiên chứa thông tin về quyền truy cập chức năng ứng dụng và thông tin của những người tham gia đã tham gia cùng một phiên.
Mỗi khách hàng nhận thông tin phiên và danh sách truy cập từ máy chủ cho mục đích đồng bộ hóa vào mỗi giây. Theo quyền truy cập đã thay đổi, chức năng của máy khách sẽ thay đổi (Bật/Tắt).
Tôi đang sử dụng lớp MemoryCache để lưu trữ thông tin phiên trong dịch vụ WebAPI như dưới đây.
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;
}
}
}
}
Vấn đề của tôi là liên quan đến hành vi không phù hợp của bộ nhớ cache.
Khi khách hàng gửi cuộc gọi đồng bộ hóa, nó sẽ cho kết quả không phù hợp. Đối với một số yêu cầu, khách hàng nhận được dữ liệu thích hợp và cho một số yêu cầu khách hàng được thay thế dữ liệu null sau khi một số yêu cầu.
Tôi đã thêm trình gỡ rối và giám sát đối tượng cho kết quả không, sau đó "memoryCache.Get (" SessionCollection ")" cũng không có giá trị. Sau khi một số yêu cầu liên tiếp nó sẽ được thích hợp một lần nữa. Tôi không hiểu tại sao đối tượng này không bền bỉ.
Cách khác, tôi đã thử "HttpContext.Current.Application [" SessionCollection "]". Tuy nhiên, vấn đề tương tự cũng có.
Tôi đã đọc khoảng "tái chế hồ bơi ứng dụng", nó sẽ tái chế tất cả bộ nhớ cache sau thời gian hạt. Nếu đối tượng được lưu trong bộ nhớ cache của tôi được tái chế bằng cách tái sử dụng pool, thì làm thế nào tôi có thể lấy lại đối tượng này?
Vui lòng một số có thể giúp tôi thoát khỏi vấn đề này. Cảm ơn trước.
Chỉ muốn kiểm tra lại thời gian máy chủ của bạn cũng được đặt thành UTC. Có thể giá trị thời gian chờ thực sự xảy ra trước khi bạn mong đợi không? – ManOVision
Btw, MemoryCache là chủ đề an toàn nên không cần khóa –
.Bạn sử dụng phiên bản NET nào? – RAM