ASP.NET MVC Высокая задержка - задержка между запросом ajax и вызовом действия из-за записи большого файла - PullRequest
0 голосов
/ 15 апреля 2019

Обновление 2019-04-24

Проблема TL; DR один вызов контроллера вызывал задержку следующих нескольких вызовов ~ 15 с, прежде чем они даже достигли контроллеров.

Я сузил причину записи большого файла в запросе, которая вызывает дальнейшую задержку File.WriteAllText(htmlFilePath, reportHTML);

Оригинальный пост

Проблема

У меня длительный запрос контроллера для генерации отчета. После того, как отчет сгенерирован, выполняются дополнительные http-запросы для получения результирующих изображений.

Однако вызовы http для изображений занимают около 15 секунд между вызовом ajax в браузере и вызовом действия контроллера. После этого метод работает быстро.

Доказательства пока

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

Задержка также происходит только при первом запросе изображения после генерации отчета. После этого нет задержки.

Также нет состояния сеанса и отключение состояния сеанса не имеет никакого эффекта

Аск

Кто-нибудь знает, что может вызвать эту задержку? Как можно лучше понять блоки в коде ASP.NET или процессах IIS?

Другие детали:

Использование CoreHtmlToImage для генерации отчетов и эмулятора хранения Azure для хранения изображений. ASP.NET MVC - это версия 5.2.3 (не ядро)

1 Ответ

0 голосов
/ 24 апреля 2019

Оказывается, что запись в каталог веб-сайта заставляет веб-сервер перезагружать сайт

Источник: Создание временных файлов в папке wwroot ASP.Net MVC3

Так что если вы пишете файлы, используя рабочий каталог сборки, например

var uriAssemblyPath = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
var assemblyPath = new Uri(uriAssemblyPath).LocalPath;
var baseDirectory = System.IO.Path.GetDirectoryName(assemblyPath);

Вы столкнетесь с этой проблемой.

Если вам нужен согласованный каталог вне webroot, вы можете использовать назначенный временный каталог

Path.GetTempPath()

Источник: Где я могу записать временный файл из ASP.NET?

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