【问题标题】:ASP.NET MVC 5 concurrent requests are queued even with disabled Session即使禁用会话,ASP.NET MVC 5 并发请求也会排队
【发布时间】:2024-05-03 20:45:01
【问题描述】:

在考虑否决或告诉我“google it”之前,请更仔细地阅读问题。这是旧/经典问题,但旧/经典解决方案不再有效。这是在 Visual Studio 2013/2015 中重现的非常简单的场景:

1) 使用 MVC 模板创建 ASP.NET Web 应用程序:

2) 打开 Controllers\HomeController.cs 并将属性添加到控制器和“睡眠”操作:

[SessionState( System.Web.SessionState.SessionStateBehavior.Disabled)]
public class HomeController : Controller
{
    public ActionResult Sleep(int? time)
    {
        System.Threading.Thread.Sleep(time ?? 3000);
        return Content("OK");
    }

    public ActionResult Index()
    {
...

3) 打开文件:Views\Home\Index.cshtml 并使用以下内容添加/替换内容 html:

<script>
    function ReqClick() {
        var startTime = Date();

        $.ajax("/Home/Sleep")
        .success(function () {
            var log = $("#log");
            var endTime = Date();
            log.text(log.text() + "Start: " + startTime.toString() + "  === " + endTime.toString());
        });
    };
</script>

<button type="button" onclick="ReqClick();">
    Request
</button>
<div>
    <textarea id="log" style="width:640px; height:480px"></textarea>
</div>

4) 运行它(无论您使用的是 IIS 还是 IIS Express 或 Vs Dev Server)- 打开主页/索引。单击 F12 打开开发工具,打开网络选项卡。在主页上快速单击“请求”按钮两次。您可以看到第二个请求大约需要 6 秒:

在控制器的调试模式下,您可以看到 Session 为空:

Cookie 完全为空(没有 ASP.NET 会话 ID)

请让我知道我缺少什么?

将以下设置添加到 web.config 也无济于事:

<sessionState mode="Off"/>
<pages enableSessionState="ReadOnly"/>

【问题讨论】:

  • 如果您使用Fiddler 之类的方法调用服务器方法,您会注意到请求在客户端而不是服务器上排队。您的服务器端代码确实允许多个请求,是浏览器将它们排队。尝试使用 Fiddler 中的 Composer 创建您的测试请求。
  • 如果你在你的 ajax 请求中设置了 'cache: false' 就可以证明这一点。
  • 我一点也不耽误。问题是你本地的。该代码对我来说很好。无论多少请求,每次请求 3 秒。
  • 也许您将应用程序池中的 Max Worker Threads 设置为 1?

标签: asp.net-mvc multithreading concurrency asp.net-mvc-5 session-state


【解决方案1】:

当我用这个属性装饰我的控制器时,并发并行请求对我有用

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

它比上述禁用会话状态效果更好,并在 MVC 3 中重新添加。More info here

【讨论】:

  • 在 vs2010 上为我解决了
【解决方案2】:

我在这个问题上花了很多时间,发现您在上面看到的很多信息也没有纠正这个问题。我的并行请求总是在排队,我在 Internet Explorer 和 Firefox 中都看到了这一点。

我发现这篇文章与我正在使用 MVC 应用程序this article有关

这表明您可以使用 Disabled [SessionState(SessionStateBehavior.Disabled)] 而不是将其设置为 ReadOnly。

我将执行 AJAX GET 调用的代码移至它自己的控制器,因为当前控制器中有其他代码通过 TempData 使用 Session。这纠正了我的问题,并且我对禁用会话的控制器的 $.get() 调用将与对使用会话的其他控制器的 $.post() 并行处理。

【讨论】:

  • 嗨。我的用例有点不同。我希望随后的请求不排队,但有点被杀死或根本没有服务。你能帮我做吗?