Modello di flusso di lavoro padre-figlio con duplex durevole

Un approccio di progettazione comune per l'implementazione di un flusso di lavoro per un processo complesso di lunga durata consiste nell'identificare le parti della logica di business isolabili in flussi di lavoro più piccoli, semplici e riutilizzabili, quindi coordinarne l'esecuzione dal flusso di lavoro principale. Ad esempio, per l'elaborazione di ordini di acquisto è possibile scegliere di definire la logica di spedizione come flusso di lavoro (figlio) che a sua volta viene chiamato dal flusso di lavoro principale (padre) dell'ordine di acquisto, se necessario.

In Windows Workflow Foundation in .NET Framework 4, non sono integrate funzionalità per chiamare un flusso di lavoro di lunga durata da un altro. Esiste, tuttavia, un numero di opzioni di implementazione che consentono a uno sviluppatore di configurare manualmente tale comportamento. La discussione di tutte le opzioni possibili non rientra nell'ambito di questo esempio; al contrario, l'attenzione qui si rivolge a uno degli approcci più comuni all'implementazione del modello "Flusso di lavoro di chiamate" o di duplex durevole e in modo specifico nel contesto dei servizi di flussi di lavoro WCF di lunga durata (flussi di lavoro XAMLX). Il concetto alla base del modello di duplex durevole è il seguente: un elemento padre esegue una chiamata a un endpoint visualizzato dall'elemento figlio, il quale passerà un token contestuale (utilizzato per la correlazione) e un indirizzo di richiamata insieme al messaggio di richiesta. Trascorso quindi del tempo dal completamento dell'attività dell'elemento figlio, quest'ultimo eseguirà una richiamata all'elemento padre per informarlo del completamento dell'operazione.

Per ulteriori informazioni sulla configurazione manuale della correlazione duplex durevole, vedere l'articolo del sito Web MSDN Duplex durevole (https://go.microsoft.com/fwlink/?LinkId=196632), gli esempi WF correlati in Duplex durevole (https://go.microsoft.com/fwlink/?LinkId=194430) e la sezione relativa alla procedura di creazione di un servizio di flusso di lavoro che chiama un altro servizio di flusso di lavoro.

L'obiettivo principale di questo esempio consiste nel fornire due attività personalizzate basate sull'interfaccia IActivityTemplateFactory e progettate per semplificare l'implementazione della correlazione duplex durevole mediante l'automazione del processo di configurazione. L'attività Workflow Callable Sequence viene utilizzata nel flusso di lavoro figlio, invece delle attività predefinite di Invio e ricezione generate durante la creazione del flusso di lavoro. L'attività Call Workflow Sequence viene utilizzata nel flusso di lavoro padre per generare le attività e le attività di configurazione correlate richieste per comunicare con il flusso di lavoro figlio. Queste attività sono riutilizzabili e possono essere aggiunte alla casella degli strumenti di Visual Studio.

L'esempio è costituito da due soluzioni:

  • la soluzione CallWorkflowActivities contiene le due attività menzionate sopra. Per abilitare queste attività per l'utilizzo in Progettazione flussi di lavoro di Visual Studio, è sufficiente compilare la soluzione e aggiungere le attività dall'assembly risultante alla casella degli strumenti di Visual Studio.

  • La seconda soluzione (DurableDuplex_with_CallWorkflowActivities) è un'implementazione di esempio di flussi di lavoro padre e figlio che comunicano mediante l'utilizzo del duplex durevole configurato mediante le attività Workflow Callable Sequence e Call Workflow Sequence.

Nota

Gli esempi vengono forniti solo per scopi didattici. Non sono destinati a essere utilizzati in un ambiente di produzione e non sono stati testati in un ambiente di produzione. Microsoft non fornisce supporto tecnico per questi esempi.

Prerequisiti

Questa applicazione di esempio è destinata agli utenti con i seguenti livelli di esperienza o conoscenza:

  • Conoscenza di base di Internet Information Services (IIS)

  • Conoscenza di base delle applicazioni WCF e Windows Workflow Foundation (WF)

  • Conoscenza di base di Windows PowerShell

  • Conoscenza di base di Microsoft SQL Server

Inoltre, è necessario installare le funzionalità di runtime di servizi di hosting di Microsoft AppFabric 1.1 per Windows Server e configurare le seguenti funzionalità per poter eseguire la soluzione DurableDuplex_with_CallWorkflowActivities:

  • Archivio salvataggi permanenti

  • Archivio di monitoraggio

Posizione e file delle applicazioni di esempio

Soluzione 1: CallWorkflowActivities

Nome file Descrizione

CallWorkflowActivities.sln

File per la soluzione CallWorkflowActivities

CallWorkflowActivities

Cartella progetto

CallWorkflowActivities.csproj

File progetto

Properties\AssemblyInfo.cs

File informazioni assembly

Activities\WorkflowCallableSequence.cs, Activities \CallWorkflowService.cs

File di origine per le due attività IActivityTemplateFactory: WorkflowCallableSequence e CallWorkflowService

UI\CallWorkflowConfiguration.xaml, UI\CallWorkflowConfiguration.xaml.cs, UI\WebConfigContent.xaml, UI\WebConfigContent.xaml.cs, UI\WorkflowCallableSequenceConfiguration.xaml, UI\WorkflowCallableSequenceConfiguration.xaml.cs

Progettazione dell'interfaccia utente e file di origine per le finestre di dialogo utilizzate per la configurazione del duplex durevole

Code\Helpers.cs

Codice sorgente con classi di supporto

Images\requiredBang.gif

File immagine del campo obbligatorio

Soluzione 2: DurableDuplex_with_CallWorkflowActivities

Nome file Descrizione

DurableDuplex_with_CallWorkflowActivities.sln

File per la soluzione DurableDuplex_with_CallWorkflowActivities

SampleChildService

Cartella progetto per il servizio figlio di esempio

SampleChildService.csproj

File di progetto per il servizio figlio di esempio

Properties\AssemblyInfo.cs

File informazioni assembly

ChildWorkflow.xamlx

Definizione del flusso di lavoro del servizio figlio (XAMLX)

Web.config

File di configurazione Web per il servizio figlio

SampleParentService

Cartella progetto per il servizio padre di esempio

SampleParentService.csproj

File di progetto per il servizio padre di esempio

Properties\AssemblyInfo.cs

File informazioni assembly

ParentWorkflow.xamlx

Definizione del flusso di lavoro del servizio padre (XAMLX)

Web.config

File di configurazione Web per il servizio padre

SampleClient

Cartella per il client di prova

SampleClient.csproj

File di progetto del client di prova

mainForm.cs, mainForm.Designer.cs, mainForm.resx, Program.cs

File di origine per il modulo principale e l'applicazione

Properties\Resources.Designer.cs, Properties\Resources.resx, Properties\Settings.Designer.cs, Properties\Settings.settings

File correlati alle risorse e impostazioni di progetto

Properties\AssemblyInfo.cs

File informazioni assembly

app.config

File delle impostazioni dell'applicazione per il client di prova

Configurazione dell'esempio

  1. Avviare Visual Studio 2010 con autorizzazioni amministrative.

    Nota

    Questa procedura descrive le modalità per generare e distribuire le soluzioni CallWorkflowActivities e DurableDuplex_with_CallWorkflowActivities con Visual Studio 2010 e configurare il pool di applicazioni predefinito da utilizzare con questi servizi.

  2. Aprire <esempi>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\CallWorkflowActivities.sln, dove <esempi> corrisponde al percorso in cui sono stati installati gli esempi di AppFabric.

  3. Scegliere Genera soluzione dal menu Genera. Verificare che il progetto venga generato senza errori nella finestra di output.

    Nota

    L'assembly con le attività WorkflowCallableSequence e CallWorkflowService è adesso compilato e pronto per essere aggiunto alla barra degli strumenti (per informazioni, vedere la sezione Esecuzione dell'esempio).

  4. Aprire <esempi>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, dove <esempi> corrisponde al percorso in cui sono stati installati gli esempi di AppFabric.

  5. Quando il sistema richiede se si desidera creare le directory virtuali per i progetti SampleParentService e SampleChildService fare clic su .

  6. Scegliere Genera soluzione dal menu Genera. Verificare che i tre progetti vengano generati senza errori nella finestra di output.

  7. Avviare Gestione Internet Information Services (IIS): Fare clic sul pulsante Start, scegliere Tutti i programmi, Microsoft AppFabric 1.1 per Windows Server, quindi Gestione Internet Information Services (IIS).

  8. Espandere il nodo del server nella visualizzazione albero sulla sinistra, quindi fare clic su Pool di applicazioni.

  9. Fare clic con il pulsante destro del mouse sul pool in elenco su cui verranno eseguiti i servizi di esempio (è possibile utilizzare uno dei pool esistenti o crearne uno nuovo), quindi selezionare Impostazioni avanzate.

  10. Impostare Versione .NET Framework su v4.0 utilizzando il menu a discesa, quindi fare clic su OK.

  11. Nel riquadro di sinistra, espandere Siti e quindi Sito Web predefinito.

  12. Individuare l'applicazione SampleChildService, fare clic con il pulsante destro del mouse e selezionare Gestisci applicazione, quindi scegliere Impostazioni avanzate.

  13. Aggiornare la proprietà Protocolli abilitati da http a http,net.pipe. Osservare l'assenza di spazi dopo la virgola. Fare clic su OK per confermare le modifiche.

  14. Nella proprietà Pool di applicazioni selezionare il pool di applicazioni configurato al passaggio 9.

  15. Individuare l'applicazione SampleParentService, fare clic con il pulsante destro del mouse e selezionare Gestisci applicazione, quindi scegliere Impostazioni avanzate.

  16. Aggiornare la proprietà Protocolli abilitati da http a http,net.pipe. Osservare l'assenza di spazi dopo la virgola. Fare clic su OK per confermare le modifiche.

  17. Nella proprietà Pool di applicazioni selezionare il pool di applicazioni configurato al passaggio 9.

    Nota

    Nei passaggi dal 13 al 16, viene aggiunto il protocollo net.pipe alle applicazioni di servizio padre e figlio per la gestione di istanze di flussi di lavoro permanenti.

Esecuzione dell'esempio: Opzione 1

  1. Avviare Visual Studio 2010 con autorizzazioni amministrative.

    Importante

    Esistono due opzioni per eseguire l'esempio e la procedura per entrambi i casi è riportata in questo argomento. Nell'Opzione 1 viene esaminata l'esperienza end-to-end dell'utilizzo delle attività WorkflowCallableSequence e CallWorkflowService per chiamare un flusso di lavoro figlio da un flusso di lavoro padre, mentre nell'Opzione 2 viene analizzata solo la soluzione finale: un'implementazione della correlazione duplex durevole pronta all'uso, senza alcuna considerazione per la fase di progettazione. Per ulteriori informazioni, vedere la sezione delle dimostrazioni seguenti:

    Nota

    La soluzione CallWorkflowActivities è progettata per migliorare l'esperienza in fase di progettazione dell'implementazione di un duplex durevole. Pertanto, non vi è alcun elemento da eseguire. Tuttavia, in questa procedura viene fornito uno scenario di utilizzo delle attività in una soluzione semplice dove un flusso di lavoro padre richiama un flusso di lavoro figlio.

  2. Creare un nuovo progetto di tipo Applicazione servizio flusso di lavoro WCF (questo modello di progetto si trova sotto i tipi di progetto Flusso di lavoro) e assegnare al nuovo progetto il ChildService.

  3. Aggiunta delle attività personalizzate di esempio alla casella degli strumenti: Quando viene visualizzato Progettazione WF, fare clic con il pulsante destro del mouse sulla casella degli strumenti all'interno del gruppo di attività Messaggistica.

  4. Selezionare Scegli elementi, quindi fare clic sulla scheda Componenti System.Activities.

  5. Fare clic su Sfoglia e passare alla cartella <esempi>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\ CallWorkflowActivities\bin\Debug. Selezionare quindi l'assembly CallWorkflowActivities.dll e fare clic su Apri. L'assembly indicato è quello compilato al passaggio 3 della sezione Configurazione dell'esempio del presente documento. Si noti che le due nuove voci si trovano nella parte superiore dell'elenco Componenti System.Activities.

  6. Scegliere OK per aggiungere le attività CallWorkflowService e WorkflowCallableSequence alla casella degli strumenti. La casella degli strumenti dovrebbe essere simile alla schermata seguente.

  7. Implementazione del flusso di lavoro ChildService: In Esplora soluzioni rinominare il file Service1.xamlx in ChildService.xamlx.

  8. Nell'area principale della finestra di progettazione di ChildService, selezionare l'attività Servizio sequenziale e premere Canc.

  9. Trascinare l'attività WorkflowCallableSequence dalla casella degli strumenti in Progettazione WF. Verrà visualizzata la finestra di dialogo di configurazione in cui verrà illustrata l'attività di configurazione del ChildService in qualità di partecipante al duplex durevole.

  10. Configurazione della proprietà WorkflowCallableSequence: Immettere le proprietà come mostrato nella schermata seguente, quindi scegliere OK.

  11. Aggiornamento del file web.config: Il funzionamento dell'implementazione del duplex durevole dipende fortemente dalla correttezza delle voci contenute nel file web.config. Nella schermata Aggiornamenti di Web.config vengono generate automaticamente le voci richieste per il file web.config del flusso di lavoro figlio.

    Nota

    Il file web.config stesso non viene automaticamente aggiornato. Nel prossimo passaggio, si copieranno/incolleranno le voci richieste al file web.config.

  12. Fare clic su Copia negli Appunti & Chiudi. In questo modo vengono copiate le voci richieste selezionate negli Appunti, pronte per essere incollate nel file web.config. Fare clic su OK nella finestra del messaggio.

  13. Aprire il file web.config del progetto ChildService e incollare il contenuto degli Appunti (creato nel Passaggio 12) subito dopo il tag <system.serviceModel>:

    ...
      <system.serviceModel>
    
        <services>
          <service name="ChildService">
            <endpoint address="" binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceStartWorkflow" />
          </service>
        </services>
        <client>
          <endpoint binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceWorkflowCompleted" />
        </client>
    
        <behaviors>
      ...
    
  14. Implementazione dell'implementazione del flusso di lavoro ChildService: Per semplicità, nel corpo del flusso di lavoro verrà assegnato solo il valore della richiesta alla risposta (entrambe sono stringhe per impostazione predefinita, tuttavia in un'implementazione reale possono essere aggiornate in contratti dati).

    1. Trascinare un'attività Ritardo dalla casella degli strumenti nella sequenza Corpo. Configurare l'attività Ritardo con le seguenti proprietà: Durata = Nuovo TimeSpan(0, 2, 0).

    2. Trascinare un'attività Assegna dalla casella degli strumenti nella sequenza Corpo, subito dopo la sequenza Ritardo. Configurare l'attività Assegna con le seguenti proprietà: A = risposta; Valore = richiesta.

    3. Salvare il progetto.

  15. Abilitazione del servizio per l'hosting IIS/WAS: Per configurare il flusso di lavoro per l'hosting in IIS/WAS e AppFabric, in Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto ChildService (non la soluzione), quindi scegliere Proprietà.

  16. Selezionare la terza pagina di configurazione, Web, quindi scegliere Usa server Web IIS locale nella sezione Server. Fare clic su Crea directory virtuale, quindi scegliere OK nella finestra di messaggio popup. Salvare il progetto.

  17. Creazione del flusso di lavoro ParentService: In Esplora soluzioni, fare clic con il pulsante destro del mouse sulla soluzione (non il progetto) e selezionare Aggiungi - > Nuovo progetto. Selezionare Applicazione servizio flusso di lavoro WCF come tipo di progetto e assegnare al nuovo progetto il nome ParentService. Fare clic su OK.

  18. In Esplora soluzioni rinominare il file Service1.xamlx in ParentService.xamlx.

  19. Trascinare l'attività CallWorkflowService dalla casella degli strumenti in Progettazione WF, subito dopo l'attività SendResponse. In tal modo viene visualizzata la finestra di dialogo Configurazione per CallWorkflowService.

  20. Mediante il pulsante punti di sospensione "…", cercare la definizione di flusso di lavoro ChildService.xamlx creata in precedenza e selezionare wsHttpContextBinding per stabilire una corrispondenza con la selezione del protocollo effettuata nel Passaggio 10. La finestra di configurazione dovrebbe essere simile alla seguente schermata.

    Nota

    Tutte le impostazioni per il contratto di servizio richiesta/risposta e i nomi delle operazioni sono stati automaticamente rilevati dalla definizione del servizio figlio.

  21. Fare clic su OK.

  22. Aggiornamento del file web.config: Verrà visualizzata la finestra di dialogo Aggiornamenti di Web.config con le voci richieste per connettersi al servizio figlio. Si noti che l'indirizzo effettivo dell'endpoint figlio e l'indirizzo dell'endpoint di richiamata richiedono l'input dell'utente.

  23. Fare clic su Copia negli Appunti & Chiudi. In questo modo vengono copiate le voci relative a web.config selezionate negli Appunti, pronte per essere incollate nel file web.config. Fare clic su OK nella finestra di messaggio popup.

  24. Aprire il file web.config del progetto ParentService e incollare il contenuto degli Appunti subito dopo l'elemento <system.serviceModel>.

    Nota

    Si noti il commento IMPORTANTE nel file XML: anche per il servizio padre è necessario esporre un endpoint ai propri client. Per lo scopo di questo esempio, è possibile utilizzare l'esempio <endpoint> definito nell'ambito del commento. Il file web.config file dovrebbe avere l'aspetto seguente:

    ...
      <system.serviceModel>
    
        <services>
          <service name="Service1">
            <endpoint address="" binding="basicHttpBinding" contract="IService" />
            <endpoint address="ChildCallback" binding="wsHttpContextBinding" contract="ICallChildService" name="Service1ICallChildServiceWorkflowCompleted" />
          </service>
        </services>
        <client>
          <endpoint address="https://localhost/ChildService/ChildService.xamlx" binding="wsHttpContextBinding" bindingConfiguration="Service1ICallChildService_InitCallback" contract="ICallChildService" name="Service1ICallChildServiceStartWorkflow" />
        </client>
        <bindings>
          <wsHttpContextBinding>
            <binding name="Service1ICallChildService_InitCallback" clientCallbackAddress="https://localhost/ParentService/ParentService.xamlx/ChildCallback" />
          </wsHttpContextBinding>
        </bindings>
    
        <behaviors>
          <serviceBehaviors>
      ...
    
  25. Completamento dell'implementazione del flusso di lavoro ParentService: il flusso di lavoro padre dovrà passare i valori parametro alla chiamata al servizio nel servizio figlio.

    1. Per assegnare un valore alla richiesta, trascinare un'attività Assegna dalla casella degli strumenti nella sequenza Flusso di lavoro chiamate, subito prima dell'attività Invia richiesta. Configurare l'attività Assegna con le seguenti proprietà: A = request; Valore = data.ToString.

    2. Salvare il progetto.

  26. Abilitazione del servizio per ParentService l'hosting IIS/WAS: Per configurare il flusso di lavoro per l'hosting in IIS/WAS e AppFabric, in Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto ParentService (non la soluzione), quindi scegliere Proprietà.

  27. Selezionare la terza pagina di configurazione, Web, quindi scegliere Usa server Web IIS locale. Fare clic su Crea directory virtuale, quindi scegliere OK nella finestra di messaggio popup. Salvare il progetto.

  28. Creare la soluzione.

  29. Configurazione di IIS/WAS per l'hosting dei servizi ParentService e ChildService durevoli: Avviare Gestione Internet Information Services (IIS): Fare clic sul pulsante Start, scegliere Tutti i programmi, Microsoft AppFabric 1.1 per Windows Server, quindi Gestione Internet Information Services (IIS).

  30. Nel riquadro di sinistra, espandere Siti e quindi Sito Web predefinito.

  31. Individuare l'applicazione ChildService, fare clic con il pulsante destro del mouse e selezionare Gestisci applicazione, quindi scegliere Impostazioni avanzate.

  32. Aggiornare la proprietà Protocolli abilitati da http a http,net.pipe. Osservare l'assenza di spazi dopo la virgola. Fare clic su OK per confermare le modifiche.

  33. Individuare l'applicazione ParentService, fare clic con il pulsante destro del mouse e selezionare Gestisci applicazione, quindi scegliere Impostazioni avanzate.

  34. Aggiornare la proprietà Protocolli abilitati da http a http,net.pipe. Osservare l'assenza di spazi dopo la virgola. Fare clic su OK per confermare le modifiche.

  35. Eseguire l'applicazione WCFTestClient per avviare l'istanza del flusso di lavoro padre. Per avviare l'applicazione WCF Test Client, digitare il seguente comando: C:\Programmi\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe (per piattaforme a 32 bit) oppure "C:\Programmi (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe" (per piattaforme a 64 bit).

  36. Selezionare Aggiungi->Aggiungi servizio per aggiungere un riferimento al servizio padre: https://localhost/ParentService/ParentService.xamlx.

  37. Dopo aver aggiunto il riferimento, fare doppio clic sul metodo GetData(), quindi digitare 123 nel riquadro sinistro come valore del parametro int. Scegliere Richiama.

  38. Utilizzare il Dashboard AppFabric per controllare lo stato delle istanze ParentService e ChildService. Dopo il completamento del servizio ChildService, si noterà che verrà completato anche l'elemento padre a seguito della ricezione della notifica di completamento dall'elemento figlio.

Esecuzione dell'esempio: Opzione 2

  1. Avviare Visual Studio 2010 con autorizzazioni amministrative.

    Importante

    Esistono due opzioni per eseguire l'esempio e la procedura per entrambi i casi è riportata in questo argomento. Nell'Opzione 1 viene esaminata l'esperienza end-to-end dell'utilizzo delle attività WorkflowCallableSequence e CallWorkflowService per chiamare un flusso di lavoro figlio da un flusso di lavoro padre, mentre nell'Opzione 2 viene analizzata solo la soluzione finale: un'implementazione della correlazione duplex durevole pronta all'uso, senza alcuna considerazione per la fase di progettazione. Per ulteriori informazioni, vedere la sezione delle dimostrazioni seguenti:

  2. Aprire <esempi>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, dove <esempi> corrisponde al percorso in cui sono stati installati gli esempi di AppFabric.

  3. Verificare che il SampleClient sia impostato come progetto di avvio: fare clic con il pulsante destro del mouse sul progetto SampleClient, quindi scegliere Imposta come progetto di avvio.

  4. Premere F5 per eseguire l'esempio. Verrà avviata l'applicazione client di prova di esempio.

  5. Fare clic su Chiama ParentService.

  6. Osservare il testo di Istanze del flusso di lavoro, in cui vengono visualizzati gli eventi di avvio/completamento dei flussi di lavoro padre e figlio. In questo esempio, il servizio padre avvia tre istanze del servizio figlio, mediante l'attività ParallelForEach e viene completato al completamento di tutti i tre elementi figlio. È inoltre possibile tenere traccia delle istanze padre/figlio in esecuzione mediante il Dashboard AppFabric.

    Nota

    Il flusso di lavoro figlio viene sospeso per due minuti dopo l'avvio. Durante tale periodo, tutte le istanze padre e figlio entrano in modalità di inattività e vengono mantenute nell'archivio salvataggi permanenti. Gli eventi di completamento verranno generati al termine dei due minuti.

Rimozione dell'esempio

  1. Avviare Gestione Internet Information Services (IIS): Fare clic sul pulsante Start, scegliere Tutti i programmi, Microsoft AppFabric 1.1 per Windows Server, quindi Gestione Internet Information Services (IIS).

  2. Espandere il nodo del server nella visualizzazione albero sulla sinistra. Espandere Siti, quindi Sito Web predefinito.

  3. Fare clic sul nodo SampleChildService e quindi su Rimuovi.

  4. Fare clic su per confermare la rimozione dell'applicazione selezionata.

  5. Fare clic sul nodo SampleParentService e quindi su Rimuovi.

  6. Fare clic su per confermare la rimozione dell'applicazione selezionata.

  7. Se sono state seguite le istruzioni contenute nel paragrafo Opzione 1 della sezione "Esecuzione dell'esempio", sarà inoltre necessario effettuare quanto segue:

    1. Fare clic sul nodo ChildService e quindi su Rimuovi.

    2. Fare clic su per confermare la rimozione dell'applicazione selezionata.

    3. Fare clic sul nodo ParentService e quindi su Rimuovi.

    4. Fare clic su per confermare la rimozione dell'applicazione selezionata.

Dimostrazioni

Esistono due opzioni per eseguire l'esempio e la procedura per entrambi i casi è riportata in questo argomento. L'Opzione 1 è consigliabile rispetto all'Opzione 2 perché viene esaminata l'esperienza end-to-end dell'utilizzo delle attività WorkflowCallableSequence e CallWorkflowService per richiamare un flusso di lavoro figlio da un flusso di lavoro padre che rappresenta l'obiettivo principale di questo esempio. L'Opzione 2 si rivolge esclusivamente alla soluzione finale: un'implementazione di duplex durevole pronta all'uso che ignora completamente l'esperienza di progettazione.

Nel paragrafo Opzione 1 della sezione "Esecuzione dell'esempio" viene illustrato come utilizzare le due attività personalizzate in un progetto.

Viene innanzitutto creato il servizio flusso di lavoro figlio; viene eliminata l'attività Servizio sequenziale predefinita e sostituita con "l'attività" WorkflowCallableSequence: si tratta di una factory di modelli di attività che, in base all'input dell'utente, genera e configura le attività di messaggistica (Receive e Send) in modo che supportino la correlazione richiamate. Per la correlazione richiamate è necessario che il contesto delle richieste contenga un token contestuale per l'esecuzione della correlazione inversa sull'elemento padre, nonché l'indirizzo di richiamata a cui inviare la notifica di completamento. L'attività Receive inizializza un handle di correlazione richiamate dalla richiesta in ingresso, mentre l'attività Send successiva a tale handle reinvia la notifica di completamento all'elemento padre all'indirizzo dinamico di richiamata passato con la richiesta iniziale.

La logica WorkflowCallableSequence genera, inoltre, le voci web.config per il servizio, gli endpoint del servizio e del client e per tutte le voci richieste.

Nel passaggio successivo verrà creato il flusso di lavoro Padre. La factory di modelli di attività CallWorkflowService richiede la definizione dell'elemento figlio, verifica la configurazione e genera di conseguenza le attività di messaggistica (Send e Receive) richieste per la comunicazione di duplex durevole con l'elemento figlio. L'attività Send inizializza la correlazione richiamate (questo è logicamente il passaggio in cui il token contestuale univoco viene generato e passato con la richiesta al flusso di lavoro figlio), mentre l'attività Receive esegue la correlazione delle notifiche di completamento restituite dal flusso di lavoro figlio con lo stesso token contestuale (mediante l'esecuzione della correlazione con il relativo handle inizializzato con l'attività Send).

La logica CallWorkflowService genera, inoltre, le voci web.config per il servizio, gli endpoint del servizio e del client e per tutte le voci richieste. Si noti l'utilizzo dell'attributo clientCallbackAddress nella definizione della configurazione di binding personalizzata. Si tratta dell'indirizzo che verrà incluso nel messaggio di richiesta al client in modo tale che quest'ultimo possa rispondere dinamicamente al chiamante corretto (in questo caso, il flusso di lavoro padre).

Nel paragrafo Opzione 2 della sezione "Esecuzione dell'esempio" viene fornita una soluzione di duplex durevole pronto all'uso mediante l'utilizzo dell'elemento WorkflowCallableSequence nel flusso di lavoro figlio e CallWorkflowService nel flusso di lavoro padre.

Il client esegue una chiamata al servizio padre, il quale a sua volta avvia tre istanze del servizio figlio in parallelo mediante l'attività ParallelForEach. Il servizio figlio, dopo aver ricevuto il messaggio iniziale dall'elemento padre, viene sospeso per due minuti (mediante un'attività Delay) e trascorsi i quali reinvia una notifica di completamento all'elemento padre. L'elemento padre viene completato solo al completamento di tutte le istanze del servizio figlio. Le istanze padre e figlio registrano voci nel registro eventi applicazioni utilizzando "Esempi" come origine. Nell'interfaccia utente del client viene monitorato il registro eventi applicazioni relativo all'origine di tale evento per la visualizzazione degli eventi di completamento nella casella di testo Istanze flusso di lavoro.

  2012-03-05