Бах!
Я недавно установил MiniProfiler с http://code.google.com/p/mvc-mini-profiler/, пытаясь найти все медленные звонки на моем сайте.(Их довольно много. Но я исправил многие из них в результате работы профилировщика)
Было два обычных вызова, которые, как я заметил, профилировщик сообщил, что для их возврата требуется более секундыв некоторых случаях.Это не имеет никакого смысла.Профилировщик показал, что вызов (в самом mvc) занимает около 2-4 мс, но общий вызов занял более 1 секунды.Я потратил немало времени, пытаясь сузить проблему.
Я заметил, что последующие ajax-вызовы всегда бывают мгновенными, но они выполняются с задержкой загрузки, и время первоначального вызова, похоже, всегда увеличивается с начальной загрузки страницы.поэтому я решил проверить Firebug и IE аналогичный Firebug, и сообщенное время совпадают.Тогда я решил отложить вызовы, сделанные на этой странице, примерно на 10 мсек, используя setTimeout()
.Внезапно звонки становятся именно такими, какими они должны быть с точки зрения того, сколько времени они занимают, чтобы завершить.(Обратите внимание, что фактические звонки происходят мгновенно, но сообщается, что это не так)
Я не могу понять, почему это происходит.Я пытался воспроизвести его, используя новый проект и пытаясь продублировать поведение, но, увы, в новом проекте все хорошо.Мои первоначальные мысли заключались в том, что при первоначальных вызовах ajax использовалось одно и то же соединение из-за заголовка keep alive, однако все ответы возвращались с «Closed» при сохранении активности, поэтому я не уверен, что это так.
Вот результаты различных сервисов
Мини-профилировщик
Firebug
IE'sfirebug
Обратите внимание, что я вполне уверен, что разница между результатами страницы и первым вызовом является результатом загрузки изображений для страницы.
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
});
);
Любая помощь в понимании этого будет принята с благодарностью.Спасибо:)