0

私は WorkFlow 4 (WF 4) の初心者です。MVC 3 でそれを使用して深刻な問題に直面しています。オンラインで答えを見つけることができませんでした。

ワークフローで例外が発生した場合、または出力引数で何かが返された場合にポップアップ メッセージを表示する必要があります。ユーザーが編集するページがあり、最後に [保存] ボタンをクリックします。

[保存] ボタンをクリックすると、フォームがコントローラーに送信され、ワー​​クフローが実行されます。ワークフローが完了すると、ワークフローによるデータの更新が成功したかどうかを説明する出力が表示されます。完了したアクションでこのステータスを表示する必要がありますが、メソッドがユーザーに返され、並行してワークフローがイベントを呼び出していることを意味する非同期で実行するため、できません。

コントローラーのコードは次のとおりです。

[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);
    }

ワークフローの完了時に何かをユーザーに送り返すにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

0

MVCアクションからワークフローを実行する場合は、いくつかの方法があります。まず最初に、WorkflowApplicationを同じように使用できます。私は、WorkflowApplicationにより適したAyncControllerを使用するようにコードを調整しました。

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サーバーはすべてのコアを満足させるのに十分なビジー状態になるため、非同期処理はスケール機能を損なうだけです。これで、ワークフローが主に非同期IOを実行している場合は問題ありませんが、同期IOまたは処理を実行している場合は、代わりにWorkflowInvokerを使用する方がよい場合があります。

コードは次のようになります。

public class HomeController : Controller
{
    [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 = WorkflowInvoker.Invoke(new VehiclesUpdate(), parameters);

        var model = outputs["model"];
        return View(model);
    }
}

注:コードはNotepad ++だけで作成したため、小さな構文エラーに注意してください。

于 2011-08-04T09:16:01.497 に答える