ASP.NET Core Session实现线程安全吗?

时间:2019-05-24 07:31:26

标签: multithreading session asp.net-core concurrency httpcontext

我知道there is an analogous question,但这与ASP.NET有关,与ASP.NET Core有关。答案是7到9岁,混合讨论ASP.NET和ASP.NET Core可能不是一个好主意。

在这种情况下,我的意思是线程安全:

在多个请求中使用Set(...)(通过Session访问,通过注入的HttpContext访问)的IHttpContextAccessor的读写方法(如DistributedSession)是否安全?属于同一会话?

显而易见的答案是肯定的,因为如果这样做不安全,那么所有开发人员都应使他们的会话访问代码线程安全...

我看了一下DistributedSession source code,它似乎是默认值(如上所述,我在调试器中访问的会话是_store的实例),没有任何序列化或其他技术的痕迹,就像锁一样……甚至私人Dictionary成员也是纯Incompatible types in assignment (expression has type "Union[List[Any], Dict[Any, Any], bytes, str, int, float]", variable has type "Dict[Any, Any]") ...

此线程如何安全用于并发修改?我想念什么?

1 个答案:

答案 0 :(得分:1)

DistributedSessionDistributedSessionStore registered as a transient dependency创建。这意味着DistributedSessionStore本身是隐式安全的,因为它实际上并未在请求之间共享。

会话使用字典作为基础数据源,该数据源也是DistributedSession对象的本地数据源。初始化会话后,通过访问从缓存反序列化存储的数据,会话会在访问会话时延迟初始化_store字典。 That looks like this

var data = _cache.Get(_sessionKey);
if (data != null)
{
    Deserialize(new MemoryStream(data));
}

因此,这里对_cache的访问是单个操作。 writing to the cache时也是如此。

对于IDistributedCache实现,通常可以期望它们是线程安全的,以允许并行访问。例如,MemoryCache使用a concurrent collection as the backing store

这对于并发请求意味着什么,基本上是您不应期望一个请求直接影响另一个请求的会话。会话通常只反序列化一次,因此在请求期间(由其他请求)发生的更新将不会出现。