【问题标题】:Enabling concurrent requests from same session in ASP.NET Core在 ASP.NET Core 中启用来自同一会话的并发请求
【发布时间】: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


【解决方案1】:

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

As-stated in the documentation:

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

【讨论】:

  • 寻找支持这一点的文档。
  • 会话状态是非锁定的。如果两个请求同时尝试修改会话的内容,则最后一个请求会覆盖第一个请求。 Session 被实现为一个连贯的会话,这意味着所有的内容都存储在一起。当两个请求试图修改不同的会话值时,最后一个请求可能会覆盖第一个请求所做的会话更改。
【解决方案2】:

如果你在你的控制器类上设置了这个属性

[SessionState(SessionStateBehavior.ReadOnly)]

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

您可以阅读更多关于它的信息here

【讨论】:

    猜你喜欢
    • 2011-05-02
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多