我知道有一个类似的问题,但这是关于ASP.NET的,而不是ASP.NET核心的。答案是7-9岁,把ASP.NET和ASP.NET核心混为一谈可能不是个好主意。
我指的是线程安全在本例中:
在属于同一会话的多个请求中使用Session
的读写方法(比如Session
)(通过HttpContext
访问,通过注入的IHttpContextAccessor
访问)安全吗?
显然答案是肯定的,因为如果不安全,那么所有开发人员都应该使他们访问代码线程的会话安全.
我查看了源代码,它似乎是默认的(我在调试器中访问的会话是DistributedSession
的一个实例),没有任何序列化或其他技术的痕迹,比如锁.即使是私人_store
成员也是纯Dictionary
.
对于并发修改的使用,这个线程如何是安全的?我遗漏了什么?
发布于 2019-05-24 04:37:29
DistributedSession
是由DistributedSessionStore
(即注册为临时依赖项 )创建的。这意味着DistributedSessionStore
本身是隐式安全的,因为它实际上不是在请求之间共享的。
会话使用字典作为基础数据源,该数据源也是DistributedSession
对象的本地数据源。初始化会话时,会话在访问会话时惰性地初始化_store
字典,方法是反序列化缓存中存储的数据。看上去像这样
var data = _cache.Get(_sessionKey);
if (data != null)
{
Deserialize(new MemoryStream(data));
}
所以这里对_cache
的访问是一个单一的操作。同样的情况也适用于写入缓存。
至于IDistributedCache
实现,您通常可以期望它们是线程安全的,以允许并行访问。例如,MemoryCache
使用作为备份存储的并发集合。。
所有这些对于并发请求的意义基本上是,您不应该期望一个请求直接影响另一个请求的会话。会话通常只反序列化一次,因此在请求期间发生的更新(由其他请求进行)不会出现。
https://stackoverflow.com/questions/56287806
复制