Могу ли я использовать асинхронные контроллеры в следующем сценарии? - PullRequest
2 голосов
/ 04 июля 2011

У меня есть приложение в Asp.net MVC, где в какой-то момент я хотел бы отобразить пользователю модальное диалоговое окно, которое отображало бы индикатор прогресса выполнения процесса.

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

Приложение будет запускать этот процесс асинхронно (через Ajax-запрос) и отображать ход выполнения таким же образом.

Проблема

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

  1. сделать запрос, который запустит процесс и ответит, что процесс клиента запущен.
  2. клиент будет периодически опрашивать сервер на предмет состояния процесса, получая немедленный ответ с процентным значением (вероятно, в виде JSON)
  3. когда прогресс будет равен 100%, это будет означать, что он закончился, и клиент узнает, что нужно запросить результаты.

Я не уверен, что асинхронные контроллеры работают таким образом ...

Дело в том, что я не совсем уверен, что понимаю асинхронные контроллеры, следовательно, не уверен, какой подход я должен использовать, подход к этой проблеме, как только что описано? Я сам вижу две возможности:

  1. Asp.net MVC Асинхронные контроллеры, если они могут работать таким образом
  2. Приложение службы Windows, которое обрабатывает данные по запросу и сообщает о его ходе - эта служба запускается путем записи определенной записи в БД с использованием обычного действия контроллера; это запустит его, а затем служба будет записывать свой статус выполнения в БД, поэтому мое приложение Asp.net MVC сможет прочитать его по запросам опроса клиентского процесса.

1 Ответ

1 голос
/ 04 июля 2011

Я сам не использовал контроллеры Asynch в проекте. Однако вот ссылка на кого-то, кто имеет.

асинхронная обработка-в-Asp-нетто-MVC-с-АЯКС-прогресс-бар

Я лично использовал номер 2 в большом производственном проекте.

Номер 2 - это приложение-служба, работающее на отдельном сервере, использующее OpenSSH для связи между двумя серверами. Мы периодически запрашиваем прогресс для обновления индикатора выполнения для пользовательского интерфейса клиента через AJAX.

Кроме того, отделяя свой веб-сервер от продолжительного процесса, вы разделяете свои проблемы. Ваш веб-сервер не заинтересован в записи файлов на диск, обработке ввода-вывода и т. Д. И не должен быть обременен этим.

Если ваш длительный процесс должен быть прерван или не выполнен, это не повлияет на обработку запросов и транзакций вашего веб-сервера.

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

Или, на самом деле, покажите им что-нибудь интересное, в нашем случае у нас был подписанный Java-апплет, показывающий, что именно делает их процесс в данный момент.

...