2011-08-03 2 views
0

WorkFlow 4 (WF 4)의 초보자이며 MVC 3에서 사용하는 심각한 문제를 통해 실행 중이며 온라인에서 답을 찾을 수 없습니다.컨트롤러에서 WorkFlow 4를 완료 한 후 팝업 메시지 표시

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

가 어떻게 사용자 워크 플로우 완료로 다시 뭔가를 보낼 수 있습니다 : 여기

컨트롤러에 내 코드?

미리 감사드립니다.

+0

[WorkflowInvoker] (http://msdn.microsoft.com/en-us/library/system.activities.workflowinvoker.aspx) 또는 [ManualResetEvent] (http://msdn.microsoft.com/en-us/library/system.aspx) us/library/system.threading.manualresetevent.aspx) 워크 플로 응용 프로그램이 실행을 완료 한 ASP.NET 작업자 스레드에 신호를 보냅니다. – Will

+0

예를 들어 주시겠습니까? –

+0

여기에 많이 있습니다. [wf4]를 뒤지고 읽으십시오. ASP.NET에서 [비동기 페이지] (http://msdn.microsoft.com/en-us/magazine/cc163725.aspx)를 사용하면 더 좋은 해결책이 될 수 있다고 믿기 때문에 대답하지 않겠습니다. 문제는 적절한 답변을 제공하기 위해 내가 충분히 익숙하지 않은 곳이 없다는 것입니다. – Will

답변

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를 대신 사용하는 것이 좋습니다.

코드는 다음과 같습니다.

참고 : 메모장 + + 코드는 작은 구문 오류를 알고 있었습니까?

+0

@Mautice : @Mautice : 우선, 답변을 주셔서 감사합니다. 많은 것들에 대해 눈을 뜨게되었습니다. 비동기 방식으로 작업하고 있습니다. 어떻게 작동하는지 알지만 SaveVehiclesAsync()는 void 메소드입니다. 아무것도 반환, 내 경우에는 워크 플로우가 처리되는 동안 사용자에게 무언가를 돌려주고 싶습니다. 그러면 워크 플로우가 완료되면 사용자에게 다른 것을 돌려 줄 것입니다. 워크 플로가 완료되기 전에 SaveVehiclesAsync()를 구현하여 예를 들어보기를 반환하려면 어떻게해야합니까? –

+0

서버 프로세스가 아직 활성 상태 인 동안 브라우저에 업데이트를 보내는 방법은 [this] (http://encosia.com/easy-incremental-status-updates-for-long-requests/) 게시물을 참조하십시오. – Maurice

+0

또 다른 것은이 워크 플로가 비동기 적으로 독립적으로 실행되면 안됩니다. 워크 플로가 완료 될 때까지 기다렸다가 다른 페이지로 이동하려고하면 워크 플로가 완료 될 때까지 이동하지 않습니다. –

관련 문제