Почему несколько одновременных вызовов AJAX к одному и тому же ASP.NET действие MVC вызывает блокировку браузера?



несколько дней назад я задал этот вопрос:




почему $.getJSON () блокирует браузер?




я запускаю шесть запросов jQuery async ajax при одном и том же действии контроллера почти сразу. Каждый запрос занимает 10 секунд, чтобы вернуться.



посредством отладки и регистрации запросов к методу действия я замечаю, что запросы сериализованы и никогда не выполняются параллельно. т. е. я вижу временную шкалу в моих журналах log4net, таких как это:




2010-12-13 13:25:06,633 [11164] INFO - Got:1156
2010-12-13 13:25:16,634 [11164] INFO - Returning:1156
2010-12-13 13:25:16,770 [7124] INFO - Got:1426
2010-12-13 13:25:26,772 [7124] INFO - Returning:1426
2010-12-13 13:25:26,925 [11164] INFO - Got:1912
2010-12-13 13:25:36,926 [11164] INFO - Returning:1912
2010-12-13 13:25:37,096 [9812] INFO - Got:1913
2010-12-13 13:25:47,098 [9812] INFO - Returning:1913
2010-12-13 13:25:47,283 [7124] INFO - Got:2002
2010-12-13 13:25:57,285 [7124] INFO - Returning:2002
2010-12-13 13:25:57,424 [11164] INFO - Got:1308
2010-12-13 13:26:07,425 [11164] INFO - Returning:1308


глядя на временную шкалу сети в FireFox я вижу это:



alt text



как пример журнала выше, так и временная шкала сети Firefox предназначены для одного и того же набора запросов.



сериализованы ли запросы на одно и то же действие с одной и той же страницы? я знаю о сериализованном доступе к Session объект в том же сеансе, но данные сеанса не затрагиваются.



Я раздел код на стороне клиента до a один запрос (самый продолжительный), но это все еще блокирует браузер, т. е. только когда запрос ajax завершается, браузер отвечает на любой щелчок ссылки.



то, что я также наблюдаю здесь (в инструментах разработчика Chrome), заключается в том, что при нажатии на ссылку, когда выполняется длительный запрос ajax, он сообщает A Failed to load resource ошибка сразу, которая предполагает, что браузер убил (или пытается убить и ждет?) Аякс запрос:



alt text



однако браузер по-прежнему занимает возраст для перенаправления на новую страницу.



являются ли запросы ajax действительно асинхронными или это ловкость рук, потому что javascript на самом деле однопоточный?



мои запросы просто занимают слишком много времени для этого, чтобы работать?



проблема возникает в Firefox и IE, а также.



Я также изменил скрипт, чтобы использовать $.ajax прямо и недвусмысленно установить async: true.



я запускаю это на IIS7.5, как Windows 2008R2, так и Windows 7 flavours делают то же самое.



сборки Debug и release также ведут себя одинаково.

640   2  

2 ответов:

Я пытался воспроизвести это, но не смог. Вот мой тест:

private static readonly Random _random = new Random();

public ActionResult Ajax()
{
    var startTime = DateTime.Now;
    Thread.Sleep(_random.Next(5000, 10000));
    return Json(new { 
        startTime = startTime.ToString("HH:mm:ss fff"),
        endTime = DateTime.Now.ToString("HH:mm:ss fff") 
    }, JsonRequestBehavior.AllowGet);
}

и звонок:

<script type="text/javascript" src="/scripts/jquery-1.4.1.js"></script>
<script type="text/javascript">
    $(function () {
        for (var i = 0; i < 6; i++) {
            $.getJSON('/home/ajax', function (result) {
                $('#result').append($('<div/>').html(
                    result.startTime + ' | ' + result.endTime
                ));
            });
        }
    });
</script>

<div id="result"></div>

результаты:

13:37:00 603 | 13:37:05 969
13:37:00 603 | 13:37:06 640
13:37:00 571 | 13:37:07 591
13:37:00 603 | 13:37:08 730
13:37:00 603 | 13:37:10 025
13:37:00 603 | 13:37:10 166

и консоль FireBug:

alt text

как вы можете видеть, действие AJAX выполняется параллельно.


обновление:

Кажется, что в моих первоначальных тестах запросы действительно стоят в очереди в FireFox 3.6.12 и Chrome 8.0.552.215 при использовании $.getJSON(). Он отлично работает в IE8. Мои тесты были выполнены с помощью ASP.NET проект MVC 2, VS2010, веб-сервер Cassini, Windows 7 x64 бит.

теперь, если я заменить $.getJSON() С $.get() он отлично работает во всех браузерах. Это заставляет меня поверить, что есть что-то с этим $.getJSON() что может привести к очереди запросов. Возможно, кто-то более знакомый с внутренними компонентами структуры jQuery сможет пролить больше света на это вопрос.


обновление 2:

попробуйте cache: false:

$.ajax({
    url: '/home/ajax', 
    cache: false,
    success: function (result) {
        $('#result').append($('<div/>').html(
            result.startTime + ' | ' + result.endTime
        ));
    }
});

Comments

    Ничего не найдено.