编辑:这显然是在浏览器中进行测试的问题,而不是代码。默认情况下,Core中的会话将被禁用。
原始问题:
我正在开发一个Web API,它需要同时处理多个请求,即使是来自同一个客户端。它是一个ASP.NET核心MVC(1.1.2)应用程序,目前针对完整框架(4.5.2),主要是为了与其他库兼容。
当我第一次测试我的并发性时,我很惊讶这些请求根本不是并发的。我用Google搜索并发现ASP.NET不会同时处理会话中的请求,而是将它们排队。快速测试表明,会议可能是罪魁祸首:
[HttpGet("sleep")]
public string Sleep()
{
Thread.Sleep(5000);
return $"Done at {DateTime.Now:u}";
}
当我从同一浏览器中的多个标签快速请求时,每个标签之间需要5秒钟。当我使用多个浏览器时,情况并非如此,它会在5秒钟内响应多次。
在搜索解决方案时,我一直在寻找在ASP.NET中禁用会话状态的方法,但对Core来说却没有。
就会话而言,我使用的是默认的API项目模板,而我没有采取任何措施来专门启用/设置会话状态。
有没有办法摆脱ASP.NET Core中的会话状态?或者是否有更好的解决方案来启用并发请求?
答案 0 :(得分:2)
您已经在ASP.NET Core中启用了并发请求,无需修改代码。 ASP.NET Core中的会话是非锁定的。如果有多个请求修改了会话,则最后一个操作将获胜。
As-stated in the documentation:
会话状态为非锁定。如果两个请求同时尝试 要修改会话的内容,最后一个请求会覆盖 第一。会话被实现为一个连贯的会话,这意味着 所有内容都存储在一起。当两个请求试图修改时 不同的会话值,最后一个请求可能会覆盖会话 首先做出的更改。
答案 1 :(得分:0)
如果在控制器类上设置此属性
[SessionState(SessionStateBehavior.ReadOnly)]
它会将会话设置为不锁定,因此您将能够进行并发请求
您可以阅读更多相关信息here