7

Прежде чем думать о downvoting или сообщать мне «google it», пожалуйста, внимательно прочитайте эту проблему. Это старая/классическая проблема, но старое/классическое решение больше не работает. Вот очень простой сценарий, чтобы воспроизвести в Visual Studio 2013/2015:ASP.NET MVC 5 одновременных запросов помещаются в очередь даже с отключенным сеансом

1) Создание веб-приложения ASP.NET с использованием шаблона MVC: enter image description here enter image description here

2) Открытые контроллеры \ HomeController.cs и добавить атрибут контроллер и "Sleep" действия:

[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) - Open Home/Index. Нажмите F12, чтобы открыть инструмент разработчика, откройте вкладку сети. На домашней странице нажмите кнопку «Запрос» дважды быстро. Вы можете видеть, что второй запрос занимает почти 6 секунд:

enter image description here

enter image description here

В режиме отладки в контроллере вы можете увидеть, что сессия является недействительным:

enter image description here

Печенье полностью пустой (идентификатор сеанса ASP.NET отсутствует) enter image description here

Пожалуйста, дайте мне знать, что мне не хватает?

Добавление настройки ниже web.config не помогает:

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

Если вы используете что-то например [Fiddler] (http://www.telerik.com/fiddler), чтобы вызвать метод сервера, вы заметите, что запросы поставлены в очередь на клиенте, а не на сервере. Ваш код на стороне сервера разрешает несколько запросов, это браузер, который их ставит в очередь. Попробуйте использовать Composer in Fiddler для создания ваших запросов на тесты. –

+0

Еще одно доказательство этого - если вы задали 'cache: false' для вашего запроса ajax. –

+0

У меня вообще нет задержки. Проблема локальна для вас. Код работает отлично для меня. 3 секунды на запрос для многих запросов. – rism

ответ

2

Я потратил много времени на этот вопрос и нашел большую часть информации, которую вы видели выше, также не сделал исправить проблему. Мои параллельные запросы всегда были в очереди, я видел это в Internet Explorer, а также в Firefox.

Я нашел эту статью, связанную с использованием мобильного приложения MVC this article

Это показывает, что вы можете использовать Отключено [SessionState(SessionStateBehavior.Disabled)] вместо того, чтобы установить его в ReadOnly.

Я переместил свой код, который выполнял вызов AJAX GET на свой собственный контроллер, так как у меня был другой код в текущем контроллере, который использовал Session через TempData. Это исправило мою проблему, и мой вызов контроллеру с отключенным сеансом обработал бы параллельно с $.post() другому контроллеру, который использовал сеанс.

+0

Привет. Мой вариант использования немного отличается. Я хочу, чтобы последующие запросы не были поставлены в очередь, но вроде убиты или вообще не были. Можете ли вы мне помочь? –

2

Одновременные параллельные запросы работали для меня, когда я украшен мой контроллер с этим атрибутом

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

Он работает лучше, чем выше отключение состояния сеанса и был добавлен еще в MVC 3. More info here

+0

Решенный для меня на vs2010 – jefissu