Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨会话的内存缓存_C#_Asp.net_.net_Entity Framework_Caching - Fatal编程技术网

C# 跨会话的内存缓存

C# 跨会话的内存缓存,c#,asp.net,.net,entity-framework,caching,C#,Asp.net,.net,Entity Framework,Caching,我有一个web应用程序,它使用一个带有控制器过滤器的.net API,每次都可以获取令牌并从数据库中抓取用户。我试图消除相同的数据库调用,所以我使用了MemoryCache public ObjectCache cache = MemoryCache.Default; // setting it, and only calling database again if cache is empty cache.Set("cachedUser", userFromDB, policy);

我有一个web应用程序,它使用一个带有控制器过滤器的.net API,每次都可以获取令牌并从数据库中抓取用户。我试图消除相同的数据库调用,所以我使用了MemoryCache

 public ObjectCache cache = MemoryCache.Default;

 // setting it, and only calling database again if cache is empty
 cache.Set("cachedUser", userFromDB, policy);
我的问题是我打开了另一个浏览器并以其他用户身份登录,我可以看到第一个用户仍在调试器中缓存。是调试器作用域导致了这种情况,还是多个用户在各自的浏览器会话中都有自己的缓存对象?我不确定用户A是否将保持本地缓存,用户B是否将保持本地缓存,或者用户A将保持缓存,用户B将被误认为用户A。

您的缓存密钥是
“cachedUser”
。由于密钥对于每个用户都不是唯一的,因此将检索相同的结果

一次修复是缓存在一个唯一的字段上,比如UserId。类似于-

cache.Set(userFromDB.Id、userFromDB、policy)


这是假设每个用户都有一个唯一的
Id

有趣的,也许按会话Id键入可能会有帮助?我想到了,但我可能有数千个用户。所以我假设数千个缓存密钥太多了。MemoryCache存在于服务器上,存储在内存中。如果将某个内容放入MemoryCache,它将一直保留到过期或服务器重新启动,或者您手动将其删除。@JohanP那么使用“user”这样的键缓存数据库用户将在多个会话中保持不变?您是否建议使用不同的密钥缓存每个用户?@brett还请记住,MemoryCache只适用于一台服务器。如果你的应用在服务器场或多个容器中运行,它们将不会在多个容器中持续运行。谢谢,这正是我不确定的。