Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC 5 concurrent requests are queued even with disabled Session

Before thinking about downvoting or telling me "google it", please read the problem more carefully. This is old/classic problem but old/classic solution is no longer working. Here is very simple scenario to reproduce in Visual Studio 2013/2015:

1) Create ASP.NET Web application using MVC template: enter image description here enter image description here

2) Open Controllers\HomeController.cs and add attribute to controller and "Sleep" action:

[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) Open file: Views\Home\Index.cshtml and add/replace content html with the following :

<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) Run it (does not matter if you're using IIS or IIS Express or Vs Dev Server) - Open Home/Index. Click F12 to open dev tool, open network tab. On the Home page click "Request" button twice fast. You can see that second request takes almost 6 seconds:

enter image description here

enter image description here

In Debug mode in controller you can see that Session is null:

enter image description here

Cookies are totally empty (ASP.NET Session Id is absent) enter image description here

Please let me know what I'm missing?

Adding the setting below to web.config does not help either:

<sessionState mode="Off"/>
<pages enableSessionState="ReadOnly"/>
like image 599
Philipp Munin Avatar asked Nov 09 '15 03:11

Philipp Munin


2 Answers

Concurrent parallel requests worked for me when I decorated my controller with this attribute

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

It works better than the above disabling session state and was added back in MVC 3. More info here

like image 127
RayLoveless Avatar answered Nov 19 '22 11:11

RayLoveless


I spent a lot of time on this issue and found much of the information that you saw above also did not correct the issue. My parallel requests were always queuing, I saw this in Internet Explorer as well as Firefox.

I found this article related to am using an MVC application this article

This shows that you can use Disabled [SessionState(SessionStateBehavior.Disabled)] instead of setting it to ReadOnly.

I moved my code that was performing the AJAX GET call to its own controller since I had other code in the current controller that used Session via TempData. This corrected my issue and my $.get() call to the controller with session disabled would process in parallel with the $.post() to the other controller that used session.

like image 24
Jay Avatar answered Nov 19 '22 13:11

Jay