Ajax-вызов на контроллер занимает много времени - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть простой вызов ajax из файла Javascript на контроллер MVC5.Этот вызов занимает около 2 секунд.Задачи как в JavaScript, так и в контроллере чрезвычайно просты.Я не могу показать свой полный код, но я произвел измерения производительности для всего стека вызовов.

Откуда берется эта задержка, если все действия завершаются менее чем за 10 мс?Вы можете видеть на изображении ниже, где TTFB равен 2,12 с, мой контроллер явно завершает это действие раньше, чем за 2,12 с (2 мс согласно моему тесту перфорации).

Я что-то упустил из-за проблемы с сетью - сомнительнокак это все сделано на моем ПК разработчика.Я также попробовал то же самое с полностью скомпилированным приложением, развернутым на автономном сервере IIS (UAT, но все же ...), и результаты те же.

Единственное, что приходит мне в голову - это asp.net делаетчто-то после того, как метод контроллера завершен и перед тем, как фактически вернуть данные JSON обратно в браузер?

Выполнение Javascript:

1: 1.2000 milliseconds (get values)
2: 2.4000 milliseconds (validation)
3: 2.9000 milliseconds (just before Ajax call)
4: 2172.3 milliseconds (inside Ajax Success)
5: 2174.3 milliseconds (last step in Ajax Success)
6: 0, 0, 1 (see below, these are controller values)

Выполнение контроллера:

1: 0 milliseconds (Controller init, constructor completed)
2: 0 milliseconds (Action start)
3: 1 milliseconds (Action end (just before return)

Код Javascript:

// previous steps omitted, you can see the times for steps 1-3.

$.ajax({
    type: "POST",
    url: $("#appPath").val() + "/MyController/TrivialAction",
    data: req,
    cache: false,
    global: false,
    success: function (response) {
        console.log("4: " + (performance.now() - t0) + " milliseconds.")

        // some code here...

        console.log("5: " + (performance.now() - t0) + " milliseconds.")

        console.log(response.StepsInCtrlr);
    },
    error: function (errorxhr, status, error) {
        BootBoxDiplayHtml(errorxhr.responseText);
    }
});

Вот метод возврата контроллера (согласно ответу Питера Б)

return Json(new
    {
        IsError = resp.IsError,
        ErrorMessage = string.Join("<br>", resp.ErrorMessages),
        Amount = resp.Amount.ToString("n2")
    }, JsonRequestBehavior.AllowGet);

(не точный запрос выше, а аналогичный)

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Если вы получаете постоянные холодные и теплые длинные запросы с пропущенным временем, это может указывать на используемый вами проект IoC.

Я видел, что некоторые из них занимали 0,5 с, чтобы удовлетворить запрос, что означает, что выпотерять время в черной дыре.

Я испытал, как Ninject глотает почти 0,4 секунды в крупномасштабном приложении, слишком много.Я перенес этот проект в SimpleInjector, и он был почти мгновенным.

И хотя SimpleInjector поддерживает строгий набор правил и не обеспечивает автоматическую настройку зависимостей, он вознаграждает вас за то, что вы прошли лишнюю милю с быстрым быстрым разрешением.Сейчас я использую стандарт де-факто, когда добавляю IoC.

0 голосов
/ 12 февраля 2019

То, что вы называете «окончанием действия (непосредственно перед возвратом)», означает вовсе означает, что MVC выполнено:

  • Есливы указали return View(YourModel);, затем MVC отобразит указанный просмотр в HTML с использованием объекта Model, и это займет время.

  • Если вы сделали что-то вроде return YourModel; или return Json(YourModel);, тогда MVC будетсериализуйте вашу модель в JSON.Это может показаться простым, но так ли это?Если YourModel окажется живым объектом Entity Framework, то может случиться так, что только на этом этапе Entity Framework понимает, что ему нужно генерировать и затем запускает запросы к базе данных, чтобы предоставить вам данные.И только после этого сериализация действительно может начаться.

Вам нужно больше исследовать, что происходит вне поля зрения и за кадром.Попробуйте создать реальный объект ViewModel, который отключен от Entity Framework , а затем выполните return YourViewModel; из метода Action.Если вы сделаете это, то увидите, что время обработки смещается на код внутри метода Action, а не за кулисы, и затем вы можете попытаться оптимизировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...