Работа с долгосрочными процессами в ASP.NET - PullRequest
0 голосов
/ 23 августа 2010

Мне бы хотелось узнать, как лучше всего справляться с длительными процессами, запускаемыми по требованию, с веб-страницы ASP.NET.

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

Если я иду на асинхронное выполнение с использованием службы WCF, то что произойдет, если пользователь закроет браузер во время выполнения процесса, как результат процесса или результат сбоя должны быть показаны пользователю? Чтобы решить эту проблему, я выбираю односторонние вызовы службы WCF, но проблема в том, что мне нужно создать таблицу процессов и сохранить результат (и сообщения об ошибках, если он завершится неудачно на каком-либо из этапов и какие этапы успешно завершены) в та таблица, которая является дополнительной нагрузкой, потому что есть много таких процессов с различными шагами, которые пользователь может вызывать с веб-страницы, и пользователь должен быть осведомлен о прогрессе (в простейшем случае статус может быть «процесс xyz выполняется») и как только это будет сделано, вывод должен быть отображен пользователю (например, путем выполнения хранимой процедуры).

Как лучше всего разработать решение для этого?

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

На мой взгляд, у вас есть три варианта

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

Я не вижу, чтобы число 2 было таким большим испытанием. Вы можете сделать таблицу достаточно общей, чтобы охватить все типы процессов: детали процесса можно просто закодировать в двоичном или XML-формате и интерпретировать веб-приложением. Тогда у вас есть самое надежное решение.

1 голос
/ 23 августа 2010

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

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

1 голос
/ 23 августа 2010

Я не могу сказать, какой будет лучший способ, но использование Windows Workflow Foundation для таких длительных процессов определенно является одним из способов.

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

WF предоставляет множество функций "из коробки" (особенно если ваш носитель данных - SQL Server) и может быть хорошим вариантом для рассмотрения.

http://www.codeproject.com/KB/WF/WF4Extensions.aspx может помочь вам лучше понять то же самое.

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