ASP.Net MVC длительный процесс

1

У меня есть требование создать экран отчета для разных финансовых периодов. Поскольку это довольно большой набор данных с множеством правил, процесс может занять много времени (более часа для возврата некоторых отчетов).

Каков наилучший способ обработки этого сценария внутри MVC?

Меня беспокоит:

  • блокировка экрана
  • представление
  • удобство использования
  • время ожидания запроса
Теги:
asp.net-mvc
asp.net-mvc-4

2 ответа

7
Лучший ответ

Это действительно действительные проблемы.

Как уже отмечали некоторые из комментаторов: если отчеты не зависят от ввода от пользователя, то вы можете генерировать отчеты заранее, скажем, на ночной основе.

С другой стороны, если отчеты зависят от ввода от пользователя, вы можете обойти свои проблемы несколькими способами, но вы должны по крайней мере разделить операцию на несколько этапов:

  1. Попросите у браузера запустить процесс создания отчета. Вы можете запустить новый поток и сообщить ему, чтобы он сгенерировал отчет, или вы могли бы отправить сообщение "Создать отчет" в очередь и получить сообщение об услугах и генерировать отчеты. Независимо от того, что вы делаете, убедитесь, что этот первый запрос заканчивается быстро. Он должен вернуть какой-то идентификатор, идентифицирующий только что запущенную задачу. В это время вы можете сообщить пользователю, что система обрабатывает запрос.
  2. Используйте Ajax для повторного опроса сервера для завершения отчета с использованием данного идентификатора. Предпочтительно, процесс, генерирующий отчет, должен сообщать о его прогрессе, и эта информация должна предоставляться пользователю посредством опроса Ajax. Если вы хотите получить фантазию, вы можете использовать SignalR для уведомления обозревателя прогресса.
  3. После того, как отчет будет готов, верните ссылку пользователю, где он/она может получить доступ к отчету.

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

0

Если ваше приложение работает на Windows Server с IIS, ваш код ASP.Net может создать запись в таблице db, что будет означать, что отчет должен быть создан.

Затем вы можете использовать Windows Service или консольное приложение, которое может работать на одном сервере и постоянно проверять наличие новых полей в таблице. Эта служба создаст отчет, и во время создания он должен обновить поле таблицы, чтобы указать прогресс. На странице ASP.net может отображаться индикатор выполнения, получение индикатора прогресса из db с помощью ajax-запросов или просто обновление страницы каждые несколько секунд.

Если вы работаете в облаке Windows Azure, вы можете использовать WebWorker вместо Windows Service

Для блокировки экрана на вашей странице вы можете использовать jQuery Block-UI library

Ещё вопросы

Сообщество Overcoder
Наверх
Меню