7

Zanim pomyślisz o wprowadzeniu w dół lub powiedzeniu mi "google it", przeczytaj uważnie ten problem. Jest to stary/klasyczny problem, ale stare/klasyczne rozwiązanie przestało działać. Oto bardzo prosty scenariusz do odtworzenia w Visual Studio 2013/2015:ASP.NET MVC 5 równoczesnych żądań czeka w kolejce nawet z wyłączoną sesją

1) Tworzenie aplikacji WWW z wykorzystaniem ASP.NET MVC szablon: enter image description here enter image description here

2) Otwarte sterowniki \ HomeController.cs i dodać atrybut kontroler i "Sen" akcja:

[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) Otwórz plik: Views \ Home \ Index.cshtml i dodać/wymienić zawartość HTML z następujących czynności:

<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) Uruchom go (nie ma znaczenia, jeśli używasz IIS lub IIS Express lub Vs Dev Server) - Open Home/index. Kliknij F12, aby otworzyć narzędzie programistyczne, otwórz kartę sieci. Na stronie głównej kliknij dwukrotnie przycisk "Zażądaj". Widać, że drugi wniosek trwa prawie 6 sekundach:

enter image description here

enter image description here

w trybie debugowania w sterowniku widać, że sesja jest null:

enter image description here

Cookies są całkowicie pusty (identyfikator sesji ASP.NET jest nieobecny) enter image description here

Proszę dać mi znać, czego mi brakuje?

Dodawanie ustawienie poniżej web.config nie pomaga:

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

Jeśli używasz coś podobnie jak [Fiddler] (http://www.telerik.com/fiddler), aby wywołać metodę serwera zauważysz, że żądania są umieszczane w kolejce na kliencie, a nie na serwerze. Twój kod po stronie serwera pozwala na wiele żądań, to przeglądarka ustawia je w kolejce. Wypróbuj kompozytora w skrzypku, aby utworzyć swoje żądania testów. –

+0

Więcej dowodów na to, jeśli ustawisz "cache: false" na żądanie ajax. –

+0

Nie otrzymuję w ogóle opóźnienia. Problem jest dla ciebie lokalny. Kod działa dobrze dla mnie. 3 sekundy na żądanie dla dowolnej liczby żądań. – rism

Odpowiedz

2

Spędziłem dużo czasu w tej kwestii i znaleźć wiele informacji, które widzieliśmy wcześniej też nie popraw problem. Moje równoległe żądania były zawsze w kolejce, widziałem to zarówno w przeglądarce Internet Explorer, jak i Firefox.

znalazłem ten artykuł związany używam aplikacji MVC this article

To pokazuje, że można użyć Wyłączone [SessionState(SessionStateBehavior.Disabled)] zamiast ustawiania go tylko do odczytu.

Przesłałem mój kod, który wykonywał wywołanie AJAX GET do własnego kontrolera, ponieważ miałem inny kod w bieżącym kontrolerze, który używał Session przez TempData. Poprawiło to mój problem i moje wywołanie $.get() do kontrolera z wyłączoną sesją przetwarzało równolegle z $.post() do innego kontrolera, który używał sesji.

+0

Witam. Mój przypadek użycia jest nieco inny. Chcę, aby kolejne wnioski nie były kolejkowane, ale zabite lub w ogóle nie były serwowane. Czy możesz mi w tym pomóc? –

2

jednoczesnych równoległe wnioski pracował dla mnie, kiedy urządzone mój kontroler z tego atrybutu

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

To działa lepiej niż wyżej wyłączenie stanu sesji i dodano z powrotem w MVC 3. More info here

+0

Rozwiązany dla mnie na vs2010 – jefissu