2015-12-14 30 views
0

我有一個調用WebApi的MVC4網絡應用程序。 WebApi返回一個JSON對象列表,然後將其轉換爲適當的Model並傳遞給ViewASP.NET MVC - 如何正確「緩存」用戶ID?

目前,我正在'緩存'這個對象列表,然後將其傳遞給ViewSession變量,然後可以通過分頁對其進行分頁。

我知道這是不好的。我的想法是將JSON列表存儲在數據庫中。

我需要做的是確定將數據庫中的JSON項目列表與請求它的用戶相關聯的最佳方式。每當用戶首次訪問應用程序的Controller,然後存儲可根據數據庫查詢的ID(基於GUID)時,我正在考慮創建一個Session變量。

再次,上述想法需要使用壞的Session。我可以用什麼來代替?

請注意我沒有在系統中登錄,因此沒有'用戶'表,因此ID將不得不在飛行中分配。

+0

每個會話都有一個會話ID ... – mason

回答

1

您保留在會話中的數據將可用於當前會話的任何請求,直到會話過期。

會話並不總是不好。有一些有效的用例可以在會話中存儲一些數據,前提是您不使用內存會話。 使用內存中會話不好。您應該使用小型數據庫表來存儲您希望保留在會話中的數據(例如:購物車數據等。),或者如果您確實想要會話(爲什麼?),則應使用StateServer或SqlServer會話模式

如果您不希望保留應用程序的本地數據庫來存儲此信息,您還可以考慮將其保留在緩存層而不是會話中。您可以使用點網中提供的MemoryCache類。

將數據設置到緩存的快速示例。

ObjectCache cache = MemoryCache.Default; 
CacheItemPolicy policy = new CacheItemPolicy(); 
policy.AbsoluteExpiration = DateTime.Now.AddDays(1); 

var products = new List<string> { "iPhone","MacBookPro","Beer"}; 
var userId=25; 
var cacheKey="productsOf"+userId; 

cache.Set(cacheKey, products, policy); 

並從緩存中讀取,

var userId=25; 
var cacheKey="productsOf"+userId; 
var test= cache.Get(cacheKey); 

Get方法返回一個對象,你需要明確它投射到您的自定義類/數據structuer。您可以將任何對象保留在緩存中。根據您的具體要求更新緩存的到期日期。 MemoryCache類可用於System.Runtime.Caching命名空間。

與內存中會話類似,緩存將被自動清除。所以你最好的選擇是使用一個小的本地數據庫表,我猜。

+0

非常感謝您的回覆。我目前存儲在Session中的對象可能有100多個對象的列表。我沒有看到任何性能問題,它允許我實現我需要的快速分頁。你會考慮在會話中有超過100個對象的列表嗎? – user1352057

+0

取決於你在這些物體中所擁有的以及這些物體的輕/重量。記住會話存儲在服務器中,不應超載。緩存或保留所需的最少信息。 – Shyju