我知道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]")
...
此线程如何安全用于并发修改?我想念什么?
答案 0 :(得分:1)
DistributedSession
由DistributedSessionStore
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。
这对于并发请求意味着什么,基本上是您不应期望一个请求直接影响另一个请求的会话。会话通常只反序列化一次,因此在请求期间(由其他请求)发生的更新将不会出现。