ASP.NET MVC - 如何正确地缓存'用户ID?

时间:2015-12-14 21:19:20

标签: asp.net asp.net-mvc asp.net-mvc-4 session

我有一个调用WebApi的MVC4 Web应用程序。 WebApi返回一个JSON对象列表,然后将其转换为适当的Model并传递给View

目前我正在缓存'此对象列表在传递到View变量中的Session之前,然后可以通过分页进行分页。

我知道这很糟糕。我的想法是将JSON列表存储在数据库中。

我需要做的是确定将数据库中的JSON项列表与请求它的用户相关联的最佳方法。我想在每次用户首次访问应用程序的Session时创建Controller变量,然后存储ID(基于GUID),然后可以对数据库进行查询。

上述想法再次要求使用不好的Session。我可以用什么呢?

请注意我没有登录系统,因此没有'用户'表格,因此ID必须即时分配。

1 个答案:

答案 0 :(得分:1)

您在会话中保留的数据将可用于当前会话的任何请求,直到会话过期。

会话并不总是坏事。有一些有效的用例,您可以在会话中存储一些数据,前提是您没有使用内存中会话。 使用内存中会话不好。您应该使用一个小的db表来存储您希望保留在会话中的数据( Ex:购物车数据等.. ),或者如果您真的想要会话(为什么?),您应该使用StateServer或SqlServer会话模式

如果您不希望保留应用程序的本地数据库来存储此信息,您还可以考虑将其保留在缓存层而不是会话中。您可以使用dot net中提供的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方法返回一个对象,您需要将其显式地转换为自定义类/数据结构。您可以将任何对象保留在缓存中。根据您的特定要求更新缓存的到期日期。 MemoryCache命名空间中提供了System.Runtime.Caching类。

与内存中会话类似,缓存将定期自动清除。所以你最好的选择是使用一个小的本地数据库表。我猜。