Способ, которым я обработал подобное, состоит в том, чтобы сделать что-то вроде этого:
- Клиент отправляет запрос на файл.
- Сервер добавляет это в очередь с состоянием «запрошено»и отвечает (клиенту) почти немедленно ответом, который включает URL-адрес для извлечения файла.
- Некоторый фоновый поток / worker / webJob / etc выполняется в отдельном процессе от реального веб-сервера ипостоянно следит за очередью - когда он видит новую запись, он обновляет очередь до состояния «генерируется» и начинает генерировать файл.Когда он завершает работу, он обновляет очередь до состояния «готово» и переходит на ...
- , когда сервер получает запрос на загрузку файла (через URL-адрес, предоставленный клиенту), он может проверить состояниефайла в очереди.Если не готов, он может дать ответ с указанием этого.Если он готов, он может просто ответить содержимым файла.
- Клиент может использовать ответ на первоначальный запрос для повторного запроса URL-адреса, который ему был дан по прошествии подходящего периода времени, или повторно запрашивать егокаждые пару секунд или что-либо более подходящее.
Вам нужен какой-то способ для хранения очереди, которая легко доступна для обеих частей системы - база данных очевидна, но есть и другие вещиВы могли бы использовать ...
Этот подход позволяет избежать слишком больших усилий в потоке запросов или "зависания" клиента при запросе, пока сервер компилирует файл.
Это то, что ясделали (успешно) в таких ситуациях.Это также облегчает добавление таких вещей, как время жизни, в очередь, так что файл может автоматически «истечь» через некоторое время ...