ASP.NET Core会话值丢失异常:场景B失败原因咨询
ASP.NET Core会话值丢失问题原因解析
核心问题:并发请求触发的会话快照覆盖
ASP.NET Core默认的会话机制采用请求级快照模式:每个请求启动时会读取会话数据的一份副本,直到请求结束才会把修改后的副本写回存储(默认是内存)。场景B中两个GetNextImage请求并行发送时,会出现以下情况:
- 两个请求几乎同时读取到会话的初始状态;
- 各自独立修改会话中的值;
- 后完成的请求会把自己的修改结果写回,直接覆盖先完成请求的修改,最终会话里只保留最后一次的修改,前一次的修改因此丢失。
各场景差异的本质
- 场景A(串行点击):第一个请求执行完毕并把修改写回会话后,第二个请求才开始读取会话数据,修改后再写回,不存在覆盖问题,所以会话值正常保留。
- 场景C(GetNextImage2):推测
GetNextImage2的实现采用了会话原子读写操作(比如直接使用Session.SetInt32/Session.GetInt32这类原子方法),或是直接操作会话内的引用类型对象(而非替换整个对象),避开了并发快照覆盖的问题,因此会话值不会丢失。
关于Cookie一致的补充
你提到场景B中两个请求的Cookie一致,这只能说明它们属于同一会话,但无法解决并发请求下的快照覆盖问题——Cookie仅用于标识会话,会话数据的读写逻辑才是导致值丢失的关键。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

