在ASP.NET Core中启用来自同一会话的并发请求

时间:2017-06-13 16:48:00

标签: c# session concurrency asp.net-core asp.net-core-mvc

编辑:这显然是在浏览器中进行测试的问题,而不是代码。默认情况下,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中的会话状态?或者是否有更好的解决方案来启用并发请求?

2 个答案:

答案 0 :(得分:2)

您已经在ASP.NET Core中启用了并发请求,无需修改代码。 ASP.NET Core中的会话是非锁定的。如果有多个请求修改了会话,则最后一个操作将获胜。

As-stated in the documentation

  

会话状态为非锁定。如果两个请求同时尝试   要修改会话的内容,最后一个请求会覆盖   第一。会话被实现为一个连贯的会话,这意味着   所有内容都存储在一起。当两个请求试图修改时   不同的会话值,最后一个请求可能会覆盖会话   首先做出的更改。

答案 1 :(得分:0)

如果在控制器类上设置此属性

[SessionState(SessionStateBehavior.ReadOnly)]

它会将会话设置为不锁定,因此您将能够进行并发请求

您可以阅读更多相关信息here