我遇到的情况是两个调用同时写入会话(在旧框架上运行的asp.net核心应用程序),其中一个会话变量被覆盖.
给定以下控制器代码,假设首先调用长会话,200 ms后调用短会话,800 ms后(当长会话完成时)调用两个会话的结果.
[HttpPost("[action]")]
public async Task<IActionResult> TestLongSession() {
HttpContext.Session.SetString("testb", "true");
// If we do this delay BEFORE the session ("testb") is set, then all is fine.
await Task.Delay(1000);
return Ok();
}
[HttpPost("[action]")]
public async Task<IActionResult> TestShortSession() {
HttpContext.Session.SetString("testa", "true");
return Ok();
}
[HttpGet("[action]")]
public async Task<IActionResult> TestResultOfBothSessions() {
string a = HttpContext.Session.GetString("testa");
string b = HttpContext.Session.GetString("testb");
return Ok($"A: {a}, B: {b}");
}
Run Code Online (Sandbox Code Playgroud)
最终调用的结果(TestBothSessions)是"A: , B: true".
问题是:是否有一些我错过的会议工作(又名,返回"A: true, B: true")?
显然,我可以删除延迟,一切都很好,但在实际应用程序中有一个可能需要一些时间的调用,我不想在以后编写会话变量(我想我可以用一些自定义错误处理,但问题仍然存在,我不再相信asp.net会话使用同步调用).
编辑:从浏览器调用这些端点的打字稿代码: …