Http Post - длительная задержка в состоянии ExecuteRequestHandler - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть веб-сайт asp.net mvc, размещенный на Windows Server 2012r2 Standard, который использует KnockoutJS для отображения данных в сетке.Этот сервер предназначен для процесса, с которым у меня возникли проблемы - он не обслуживает другие запросы.

Для действия контроллера GetRecords выполняется «ajax-вызов».Это очень быстро возвращает данные для пары десятков записей.

Пользователь может вносить изменения в данные и отправлять на обновление.Код нокаута делает еще один вызов ajax, на этот раз публикуя записи.На этом этапе сайт «зависает» в течение длительного времени (более 10 минут), но он успешно завершается, и обновленная дата сохраняется в базе данных.Во время «зависания» центральный процессор рабочих процессов IIS колеблется около 50%.

Я пытаюсь выяснить, что вызывает задержку.Кажется, что задержка происходит до того, как будет достигнута первая строка кода действия контроллера.Я добавил в действие оператор трассировки и вижу, что после выполнения 1-й строки действие завершается в течение нескольких секунд.

Из диспетчера IIS я углубился в "Рабочий"Процессы "\" Текущие запросы "в то время, когда страница" зависла ", я вижу, что состояние указано как" ExecuteRequestHandler ", а имя модуля -" ManagedPipelineHandler ".Другие «текущие запросы» не отображаются.

Используя инструменты разработчика Chrome, я запечатлел json, публикуемый для обновления, его размер составляет около 4 МБ.

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

Кроме того, когдаЯ размещаю такое же количество записей на одном и том же сайте, размещенном на моей виртуальной машине разработчика, после чего он работает нормально - завершает сквозную работу менее чем за 3 секунды.

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

Я создал дамп процесса рабочего процесса IIS, когда он находится в состоянии «зависания», он доступен по адресу: onedrive link

Кажетсячто «Поток 28» вызывает проблему, поскольку значение «Время, проведенное в пользовательском режиме» превышает 2 минуты.Я запросил дамп процесса через 2 минуты после отправки http-запроса с веб-сайта.Пост в конце концов закончился нормально, примерно через 20 минут

1 Ответ

0 голосов
/ 07 января 2019

Способен обойти эту проблему, минуя привязку модели MVC.Параметр модели представления (editBatchVm), который был передан в метод контроллера, заменен.Итак, вместо:

public void ResubmitRejectedVouchersAsNewBatch(EditBatchViewModel editBatchVm)
    {

у меня теперь есть:

public void ResubmitRejectedVouchersAsNewBatch()
{
    string requestData = "";
    using (var reader = new StreamReader(Request.InputStream))
    {
        requestData = reader.ReadToEnd();
    }
    EditBatchViewModel editBatchVm = JsonConvert.DeserializeObject<EditBatchViewModel>(requestData);
...