Condividi tramite


Utilizzo di flussi di lavoro con ASP.NET

Windows Workflow Foundation è progettato per essere eseguito in diversi ambienti di applicazioni host. I Web Form ASP.NET sono uno degli ambienti supportati. Tuttavia, quando si crea un'applicazione host basata su Web per Windows Workflow Foundation, è necessario progettare l'infrastruttura host tenendo conto di differenze fondamentali tra l'architettura di un'applicazione ASP.NET e di un'applicazione Windows Form tradizionale. Ad esempio, le applicazioni ASP.NET possono servire contemporaneamente più utenti sincroni. In un ambiente server di questo tipo, l'applicazione deve essere progettata in modo da utilizzare efficientemente la memoria di sistema disponibile. In questi casi, Windows Workflow Foundation fornisce il servizio SqlWorkflowPersistenceService per scaricare istanze del flusso di lavoro. Inoltre, quando ASP.NET riceve una richiesta, invia una risposta. Per impostazione predefinita, i flussi di lavoro vengono eseguiti dal runtime del flusso di lavoro in modo asincrono. Di conseguenza, una pagina può eseguire il rendering e una risposta essere inviata prima che un flusso di lavoro venga completato. Per aggirare questo problema, Windows Workflow Foundation fornisce il servizio ManualWorkflowSchedulerService per eseguire flussi di lavoro in modo sincrono, consentendo al Web Form di restituire informazioni sullo stato del flusso di lavoro all'utente.

Creazione dell'oggetto WorkflowRuntime

Il file Global.asax in ASP.NET può essere utilizzato per gestire eventi Web Form relativi a sessioni o eventi Web singoli generati all'avvio o al termine dell'applicazione Web. L'oggetto Session in ASP.NET viene creato per ogni utente che richiede una pagina Web e l'oggetto Application è un oggetto singolo condiviso in ogni sessione. Nell'esempio seguente viene illustrato come gestire l'evento Application_Start per creare un'istanza WorkflowRuntime e aggiungere la classe ManualWorkflowSchedulerService Al termine di questa operazione e dopo l'avvio del runtime utilizzando il metodo StartRuntime, è possibile salvare l'istanza WorkflowRuntime nell'oggetto Application fornito con ASP.NET. Nelle richieste future di pagine Web nell'applicazione, è possibile recuperare questa istanza WorkflowRuntime singola per avviare un flusso di lavoro.

void Application_Start(object sender, EventArgs e) 
{
    System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
        new System.Workflow.Runtime.WorkflowRuntime();

    System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService manualService =
        new System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService();
    workflowRuntime.AddService(manualService);
    
    workflowRuntime.StartRuntime();

    Application["WorkflowRuntime"] = workflowRuntime;           
}

Al termine dell'applicazione, ASP.NET genera l'evento Application_End. Nel codice seguente viene illustrato come recuperare l'oggetto WorkflowRuntime creato durante l'evento Application_Start per chiamare il metodo StopRuntime.

void Application_End(object sender, EventArgs e) 
{
    System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
        Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
    workflowRuntime.StopRuntime();
}

Avvio di flussi di lavoro in Web Form ASP.NET

Nella sezione precedente è stata creata un'istanza WorkflowRuntime durante l'evento Application_Start. Questo oggetto rimane finché l'applicazione Web gestisce richieste. Nel codice seguente viene illustrato come recuperare l'istanza WorkflowRuntime dall'oggetto Application in ASP.NET. A questo punto, utilizzare il metodo GetService per recuperare la classe ManualWorkflowSchedulerService utilizzata per avviare un flusso di lavoro per eseguire il flusso di lavoro in modo sincrono. A tale scopo, chiamare il metodo CreateWorkflow definito nella classe WorkflowRuntime seguito dal metodo Start dell'oggetto WorkflowInstance restituito dalla chiamata CreateWorkflow. Poiché la classe ManualWorkflowSchedulerService è stata aggiunta alla classe WorkflowRuntime, chiamare il metodo RunWorkflow passando il parametro InstanceId dell'oggetto WorkflowInstance.

protected void StartRuntime_Click(object sender, EventArgs e)
{
    WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
    ManualWorkflowSchedulerService manualScheduler = 
        workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) 
        as ManualWorkflowSchedulerService;

    WorkflowInstance instance = workflowRuntime.CreateWorkflow(
        typeof(ASPNetSequentialWorkflow));
    instance.Start();
    manualScheduler.RunWorkflow(instance.InstanceId);
}

Vedere anche

Riferimenti

WorkflowRuntime
ManualWorkflowSchedulerService
GetService
RunWorkflow
WorkflowInstance
StartRuntime

Concetti

Procedura: aggiungere e rimuovere servizi del flusso di lavoro

Altre risorse

Sviluppo di applicazioni del flusso di lavoro ASP.NET

Footer image

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.