【发布时间】:2017-11-15 13:46:37
【问题描述】:
编辑:这显然是在浏览器中测试的问题,而不是代码问题。默认情况下,Core 中的会话应被禁用。
原问题:
我正在开发一个需要同时处理多个请求的 Web API,即使来自同一个客户端也是如此。它是一个 ASP.NET Core MVC (1.1.2) 应用,目前针对完整框架 (4.5.2),主要是为了与其他库兼容。
当我第一次测试并发时,我很惊讶请求根本不是并发的。我四处搜索,发现 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 中的会话状态?还是有更好的解决方案来启用并发请求?
【问题讨论】:
-
您确定是 ASP .net Core 的问题而不是浏览器的问题吗?浏览器通常不会同时对同一个域执行两个以上的请求,ASP .net Core 默认禁用会话状态(您必须在 Startup 类的 ConfigureServices 函数中显式启用它,docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state)
-
我认为即使使用 Fiddler 之类的测试工具,您也应该测试此问题是否仍然存在。正如@Gusman 所说,浏览器可能会出现意外行为。
-
在 Chrome 中它一次执行一个(间隔 5 秒),而在 Postman 中它同时运行。所以我猜你是对的,谢谢!
标签: c# session concurrency asp.net-core asp.net-core-mvc