Время отклика для ajax httprequests основано на времени от начального вызова - PullRequest
0 голосов
/ 10 июня 2011

Бах!

Я недавно установил MiniProfiler с http://code.google.com/p/mvc-mini-profiler/, пытаясь найти все медленные звонки на моем сайте.(Их довольно много. Но я исправил многие из них в результате работы профилировщика)

Было два обычных вызова, которые, как я заметил, профилировщик сообщил, что для их возврата требуется более секундыв некоторых случаях.Это не имеет никакого смысла.Профилировщик показал, что вызов (в самом mvc) занимает около 2-4 мс, но общий вызов занял более 1 секунды.Я потратил немало времени, пытаясь сузить проблему.

Я заметил, что последующие ajax-вызовы всегда бывают мгновенными, но они выполняются с задержкой загрузки, и время первоначального вызова, похоже, всегда увеличивается с начальной загрузки страницы.поэтому я решил проверить Firebug и IE аналогичный Firebug, и сообщенное время совпадают.Тогда я решил отложить вызовы, сделанные на этой странице, примерно на 10 мсек, используя setTimeout().Внезапно звонки становятся именно такими, какими они должны быть с точки зрения того, сколько времени они занимают, чтобы завершить.(Обратите внимание, что фактические звонки происходят мгновенно, но сообщается, что это не так)

Я не могу понять, почему это происходит.Я пытался воспроизвести его, используя новый проект и пытаясь продублировать поведение, но, увы, в новом проекте все хорошо.Мои первоначальные мысли заключались в том, что при первоначальных вызовах ajax использовалось одно и то же соединение из-за заголовка keep alive, однако все ответы возвращались с «Closed» при сохранении активности, поэтому я не уверен, что это так.

Вот результаты различных сервисов

Мини-профилировщик

Mini profiler results

Firebug

firebug results

IE'sfirebug

ie results

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

Javascript Helper function

<script type='text/javascript'>
    function LoadJson(url, callback, error) {
        $.ajax({
            url: url,
            type: "POST",
            dataType: "json",
            success: function (ret) {
                callback(ret);
            },
            error: function (ret) {
                //alert(url);
            }
        });
    }
</script>

Фактический вызов

$(function () {
    LoadJson('/ajax/activeform', function (ret) {
        //Do something
    });
);

Любая помощь в понимании этого будет принята с благодарностью.Спасибо:)

Ответы [ 2 ]

1 голос
/ 15 июня 2012

Возможно, вы видите результат максимального подключения браузера к тому же домену. Браузеры имеют определенный предел одновременных подключений к домену. Причина, по которой ваша задержка работает, состоит в том, что это позволяет другим запросам завершать освобождение соединения, позволяя вашему ajax-запросу действовать немедленно, а не ставиться в очередь.

0 голосов
/ 02 января 2012

Время загрузки 1-2 секунды первого вызова можно отнести к загрузке сборки. Это может быть трудно проверить при запуске живого сайта. Самый простой способ - просто запустить его в отладчике и посмотреть окно вывода.

В этом случае вы можете использовать разогревающий вызов в вашем Global.asax или другом общем блоке кода для вызова метода или инициализации класса в сборке. Это заставит сборку загружаться и связываться при запуске приложения.

...