Показывать всплывающее сообщение после завершения WorkFlow 4 от контроллера MVC - PullRequest
0 голосов
/ 03 августа 2011

Я новичок в WorkFlow 4 (WF 4), у меня возникла серьезная проблема с использованием его в MVC 3, я не смог найти ответ в Интернете.

Мне нужно показать всплывающее сообщениеесли в workFlow произошло исключение или что-либо, возвращенное в аргументах outpput, у меня есть страница, которую пользователь должен отредактировать, и в конце он нажмет кнопку «Сохранить».

При нажатии кнопки «Сохранить» форма будет отправленаКонтроллер и запустить рабочий процесс, когда рабочий процесс завершен, я получил вывод, объясняющий, если обновление данных через рабочий процесс прошло успешно или нет, тогда мне нужно показать это состояние по завершенному действию, но я не могу, так как я запускаю его асинхронно, что означаетметод вернется к пользователю, и параллельно рабочий процесс вызывает событие.

Вот мой код в контроллере:

[HttpPost()]
    public ActionResult SaveVehicles(vehiclesData model) {
   Services.VehiclesDataUpdate vehiclesDataUpdate = new Services.VehiclesDataUpdate(this.SessionData.DealerLotKey, null, null);
            IDictionary<string, object> parameters = new Dictionary<string, object>();
            parameters.Add("VehiclesDataUpdate", vehiclesDataUpdate);
            parameters.Add("UnionVehicles", unionVehicles);
            parameters.Add("SolrVehicles", solrVehicles);

            IDictionary<string, object> outputs = new Dictionary<string, object>();
            AutoResetEvent syncEvent = new AutoResetEvent(false);
            WorkflowApplication wfApp = new WorkflowApplication(new VehiclesUpdate(), parameters);

            wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e) {
                outputs = e.Outputs;
                 syncEvent.Set();

                if (!errorExceptions.IsNullOrEmpty()) {
                    //TODO: Render a parital view to display an error message or the result of the workflow in the ouptput
                    //TODO: Logging.
                }
            };

            wfApp.Aborted = delegate(WorkflowApplicationAbortedEventArgs e) {
                syncEvent.Set();
            };

            wfApp.Run();

 return View(model);
    }

Как я могу отправить что-то обратно пользователю, когдазавершение рабочего процесса?

Заранее спасибо.

1 Ответ

0 голосов
/ 04 августа 2011

Если вы хотите запустить рабочий процесс из действия MVC, есть несколько способов сделать это.Во-первых, все, что вы можете использовать WorkflowApplication, как вы сделали.Я адаптировал код для использования AyncController, который лучше подходит для WorkflowApplication.

public class HomeController : AsyncController
{
    [HttpPost()]
    public void SaveVehiclesAsync(vehiclesData model)
    {
        Services.VehiclesDataUpdate vehiclesDataUpdate = new Services.VehiclesDataUpdate(this.SessionData.DealerLotKey, null, null);
        IDictionary<string, object> parameters = new Dictionary<string, object>();
        parameters.Add("VehiclesDataUpdate", vehiclesDataUpdate);
        parameters.Add("UnionVehicles", unionVehicles);
        parameters.Add("SolrVehicles", solrVehicles);

        WorkflowApplication wfApp = new WorkflowApplication(new VehiclesUpdate(), parameters);

        wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e) {
            AsyncManager.Parameters["outputs"] = e.Outputs;
            AsyncManager.OutstandingOperations.Decrement();
        };

        wfApp.Aborted = delegate(WorkflowApplicationAbortedEventArgs e) {
           AsyncManager.OutstandingOperations.Decrement();
        };

        AsyncManager.OutstandingOperations.Increment();
        wfApp.Run();
    }

    public ActionResult IndexCompleted(IDictionary<string, object> outputs)
    {
        var model = outputs["model"];
        return View(model);
    }
}

Однако это не всегда может быть лучшим решением.В общем, сервер ASP.NET будет достаточно занят, чтобы все ядра были довольны, поэтому асинхронная обработка только ухудшит возможности масштабирования.Теперь, если ваш рабочий процесс в основном выполняет асинхронный ввод-вывод, это нормально, но если он выполняет синхронный ввод-вывод или обработку, может быть лучше вместо этого использовать WorkflowInvoker.*

Примечание: код только с Notepad ++, поэтому следует помнить о небольших синтаксических ошибках.

...