Specifiche delle funzionalità di Windows Workflow Foundation

.NET Framework 4 aggiunge una serie di funzionalità a Windows Workflow Foundation. Questo documento descrive alcune delle nuove funzionalità e fornisce informazioni dettagliate sugli scenari nei quali potrebbero essere utili.

Attività di messaggistica

Le attività di messaggistica (Receive, SendReply, Send, ReceiveReply) consentono di inviare e ricevere messaggi WCF dal flusso di lavoro. Le attività Receive e SendReply, in particolare, consentono di formare un'operazione del servizio Windows Communication Foundation (WCF) esposta tramite WSDL, esattamente come i servizi Web standard di WCF, mentre le attività Send e ReceiveReply consentono di usare un servizio Web simile a un ChannelFactory di WCF; anche per Workflow Foundation esiste un'esperienza Aggiungi riferimento al servizio che genera attività preconfigurate.

Introduzione alle attività di messaggistica

  • In Visual Studio 2012, creare un progetto Applicazione di servizi flusso di lavoro WCF. Nel canvas verrà posizionata la coppia Receive e SendReply.

  • Fare clic con il pulsante destro del mouse sul progetto, quindi scegliere Aggiungi riferimento al servizio. Scegliere un servizio Web WSDL esistente e fare clic su OK. Compilare il progetto per visualizzare le attività generate (implementate tramite Send e ReceiveReply) nella casella degli strumenti.

  • Documentazione dei servizi flusso di lavoro

Scenario di esempio relativo alle attività di messaggistica

Un servizio BestPriceFinder chiama più servizi di compagnie aeree per trovare il prezzo migliore del biglietto per una determinata destinazione. Per l'implementazione di questo scenario sarebbe necessario usare le attività di messaggistica per ricevere la richiesta di prezzo, recuperare i prezzi dai servizi di back-end e rispondere alla richiesta di prezzo con il prezzo migliore. Sarebbe inoltre necessario usare altre attività predefinite per la creazione della logica di business per calcolare il prezzo migliore.

WorkflowServiceHost

L'oggetto WorkflowServiceHost è l'host del flusso di lavoro predefinito che supporta più istanze, la configurazione e la messaggistica di WCF, anche se per ospitare i flussi di lavoro non è necessario utilizzare la messaggistica. Inoltre si integra con la persistenza, il rilevamento e il controllo dell'istanza tramite un set di comportamenti del servizio. Analogamente all'oggetto ServiceHost di WCF, WorkflowServiceHost può essere un servizio indipendente ospitato in un'applicazione console/WinForms/WPF o in un servizio Windows oppure un servizio ospitato sul Web (come un file con estensione xamlx) in IIS o WAS.

Guida introduttiva all'host del servizio del flusso di lavoro

Scenario relativo a WorkflowServiceHost

Un servizio BestPriceFinder hiama più servizi di compagnie aeree per trovare il prezzo migliore del biglietto per una determinata destinazione. Per l'implementazione di questo scenario sarebbe necessario ospitare il flusso di lavoro in WorkflowServiceHost. Sarebbe inoltre necessario usare le attività di messaggistica per ricevere la richiesta di prezzo, recuperare i prezzi dai servizi di back-end e rispondere alla richiesta di prezzo con il prezzo migliore.

Correlazione

Una correlazione è una delle modalità seguenti:

  • Una modalità di raggruppamento dei messaggi, ovvero la relazione tra un messaggio di richiesta e la sua risposta.

  • Una modalità di mapping di un dato a un'istanza del servizio.

Introduzione

  • Per iniziare a usare la correlazione, creare un nuovo progetto in Visual Studio. Creare una variabile di tipo CorrelationHandle.

  • Un esempio di correlazione usata per raggruppare i messaggi è una correlazione Request-Reply che raggruppa i messaggi.

  • Un esempio di mapping di un dato a un'istanza del servizio è una correlazione basata sul contenuto che associa un dato (ad esempio un ID ordine) a una determinata istanza del flusso di lavoro.

    • In un'attività di messaggistica qualsiasi, fare clic sulla proprietà CorrelationInitializers e aggiungere un QueryCorrelationInitializer usando la variabile CorrelationHandle creata in precedenza. Nel messaggio fare doppio clic sulla proprietà desiderata (ad es. OrderID) dal menu a discesa. Impostare la proprietà CorrelatesWith sulla variabile CorrelationHandle usata in precedenza.
  • Documentazione concettuale sulla correlazione

Scenario relativo alla correlazione

Un flusso di lavoro di elaborazione ordini consente di gestire la creazione di un nuovo ordine e l'aggiornamento degli ordini esistenti in corso di elaborazione. Per l'implementazione di questo scenario sarebbe necessario ospitare il flusso di lavoro in WorkflowServiceHost e usare le attività di messaggistica. Sarebbe inoltre necessaria la correlazione basata su orderId per garantire che gli aggiornamenti vengano eseguiti nel flusso di lavoro corretto.

Configurazione semplificata

Lo schema di configurazione di WCF è complesso e fornisce agli utenti molte funzionalità difficilmente reperibili. In .NET Framework 4.6.1 l'obiettivo è aiutare gli utenti di WCF a configurare i servizi con le funzionalità seguenti:

  • Eliminare la necessità della configurazione esplicita di ogni singolo servizio. Se non viene configurato nessun elemento <service> del servizio e il servizio non definisce a livello di codice nessun endpoint, viene aggiunto automaticamente al servizio un set di endpoint, uno per ogni indirizzo di base del servizio e per ogni contratto implementato dal servizio.

  • Consentire all'utente di definire valori predefiniti per le associazioni e i comportamenti di WCF che verranno applicati ai servizi senza configurazione esplicita.

  • Gli endpoint standard definiscono endpoint preconfigurati riutilizzabili, che dispongono di valori fissi per una o più delle proprietà dell'endpoint (indirizzo, associazione e contratto) e consentono la definizione di proprietà personalizzate.

  • ConfigurationChannelFactory<TChannel> consente infine all'utente la gestione centralizzata della configurazione del client WCF, utile in scenari nei quali la configurazione viene selezionata o modificata dopo la fase di caricamento del dominio dell'applicazione.

Introduzione

Scenari di configurazione semplificati

  • Un sviluppatore ASMX esperto desidera cominciare a usare WCF. Tuttavia, WCF sembra essere molto complicato. In particolare per tutte le informazioni da scrivere in un file di configurazione. In .NET 4, è anche possibile decidere di non avere un file di configurazione.

  • È molto difficile configurare e gestire un set di servizi WCF già esistente. Il file di configurazione è composto da migliaia di righe di codice XML ed è molto pericoloso modificarle. È necessario aiutare gli utenti a ridurre la quantità di codice per renderlo più maneggevole.

Resolver del contratto dati

In .NET Framework 3.5, esistevano alcune limitazioni nella progettazione di tipi noti:

  • Non era possibile aggiungere in modo dinamico tipi noti durante la serializzazione o la deserializzazione.

  • I serializzatori non erano in grado di gestire le informazioni sconosciute su xsi:type.

  • Gli utenti non potevano specificare quale xsi:type visualizzare sulla rete per ridurre, ad esempio, le dimensioni di un'istanza di serializzazione.

DataContractResolver risolve questi problemi in .NET Framework 4.5.

Introduzione

Scenari relativi al resolver del contratto dati

  • Evitare di dichiarare decine di oggetti KnownTypeAttribute in un servizio.

  • Ridurre la dimensione del blob XML.

Diagramma di flusso

Il diagramma di flusso è uno noto paradigma per rappresentare visivamente i problemi di un dominio. In .NET Framework 4 è stato introdotto un nuovo stile del flusso di controllo. Una delle caratteristiche principali del diagramma di flusso è quella di eseguire solo un'attività alla volta. I diagrammi di flusso possono rappresentare cicli e risultati alternativi, ma non possono rappresentare a livello nativo l'esecuzione simultanea di più nodi.

Introduzione

Scenari relativi al diagramma di flusso

Un'attività del diagramma di flusso può essere usata per implementare un gioco per indovinare un numero. Il gioco è molto semplice: il computer seleziona un numero casuale e il giocatore deve indovinare il numero. Ogni volta che il giocatore invia un valore, il computer mostra un suggerimento, ad esempio "prova con un numero inferiore". Se il giocatore indovina il numero in meno di 7 tentativi, viene visualizzato un messaggio di congratulazioni speciali. È possibile implementare questo gioco con una combinazione delle attività procedurali seguenti:

Attività procedurali (Sequence, If, ForEach, Switch, Assign, DoWhile, While)

Le attività procedurali forniscono un meccanismo per modellare il flusso di controllo sequenziale usando concetti noti ai programmatori. Queste attività abilitano i costrutti del linguaggio di programmazione strutturati in modo tradizionale e, se opportuno, forniscono la parità di linguaggio con linguaggi procedurali comuni, ad esempio C# e Visual Basic.

Introduzione

Scenari relativi alle attività procedurali

  • Parallel: un sistema di gestione documenti in una rete Intranet dispone di un flusso di lavoro di approvazione dei documenti. Prima di poter essere pubblicati nella rete Intranet, i documenti devono essere approvati dai responsabili dei diversi reparti. Non esiste un ordine prestabilito per le approvazioni; quando un documento si trova nella fase "in attesa di approvazione", può essere approvato in un qualsiasi momento. Quando un utente manda in revisione un documento, deve essere approvato dal suo responsabile diretto, dall'amministratore della rete Intranet e dal responsabile delle comunicazioni interne.

  • ParallelForEach<T>: Un'applicazione WF gestisce gli acquisti di una grande società. In base a quanto definito nei regolamenti aziendali, prima di pianificare qualsiasi operazione di acquisto è necessario valutare tre fornitori diversi. Un dipendente dell'ufficio acquisti seleziona tre fornitori dall'elenco fornitori della società. Una volta selezionati e informati i fornitori, la società attenderà le proposte economiche. Le proposte possono pervenire in qualsiasi ordine. Per implementare questo scenario in WF, viene usato ParallelForEach<T> per scorrere l'elenco dei fornitori e richiedere le proposte economiche. Una volta raccolte tutte le offerte, viene scelta e visualizzata la migliore.

InvokeMethod

L'attività InvokeMethod consente di richiamare metodi pubblici in oggetti o tipi nell'ambito. Supporta il richiamo di metodi di istanza e statici con o senza parametri (incluse le matrici di parametri) e metodi generici. Consente inoltre l'esecuzione del metodo in modo sincrono e asincrono.

Introduzione

  • In Visual Studio 2012 creare un'applicazione console flusso di lavoro. Aggiungere un'attività InvokeMethod nella finestra di progettazione del flusso di lavoro e configurare i metodi di istanza e statici.

  • Documentazione della finestra di progettazione: InvokeMethod Activity Designer

Scenari relativi a InvokeMethod

  • È necessario richiamare un metodo in un oggetto nell'ambito. Ad esempio, è necessario aggiungere un valore a un dizionario. Viene richiamato il metodo Add dell'istanza del dizionario e vengono forniti la chiave e il valore.

  • È necessario richiamare un metodo su un oggetto CLR legacy. Anziché creare un'attività personalizzata per eseguire il wrapping della chiamata a quella classe legacy, è possibile usare InvokeMethod, se rientra nell'ambito durante l'esecuzione del flusso di lavoro.

Attività di gestione degli errori

L'attività TryCatch fornisce un meccanismo per il rilevamento delle eccezioni che si verificano durante l'esecuzione di un set di attività contenute (simile al costrutto Try/Catch in C# e Visual Basic). TryCatch fornisce la gestione delle eccezioni a livello di flusso di lavoro. Quando viene generata un'eccezione non gestita, il flusso di lavoro viene interrotto e non viene eseguito il blocco Finally. Questo comportamento è coerente con C#.

Introduzione

Scenari relativi alla gestione degli errori

È necessario eseguire un set di attività e, quando si verifica un errore, è necessario eseguire una logica specifica. Se durante l'esecuzione della logica di gestione degli errori si scopre che l'errore non è risolvibile, viene rigenerata l'eccezione e il problema viene gestito dall'attività padre (o dall'host).

Attività Pick

L'attività Pick fornisce il modello di flusso di controllo basato sugli eventi in WF. L'attività Pick contiene molti branch, la cui esecuzione è condizionata dal verificarsi di un particolare evento. In questa impostazione, Pick si comporta in modo analogo a Switch<T>, ovvero l'attività esegue solo uno dei set di eventi in ascolto. Ogni ramo è basato sugli eventi e l'evento che si verifica per primo determina l'esecuzione del ramo corrispondente. Tutti gli altri rami vengono annullati e interrompono l'ascolto di altri eventi.

Introduzione

Scenario relativo all'attività Pick

È necessario richiedere l'input di un utente. In circostanze normali, lo sviluppatore utilizzerebbe una chiamata al metodo come ReadLine per richiedere l'input di un utente. Il problema di questa impostazione è che il programma attende fino a quando l'utente non immette un valore. In questo scenario, è necessario un timeout per sbloccare un'attività di blocco. Un scenario comune è quello in cui è necessario completare un'attività entro un periodo di tempo specificato. Il timeout di un'attività di blocco è uno scenario in cui l'attività Pick rappresenta un valore aggiunto.

Servizio di routing di WCF

Il servizio di routing è progettato per essere un router software generico che consente di controllare il flusso dei messaggi di WCF tra client e servizi. Il servizio di routing consente di separare i client dai servizi e, di conseguenza, offre una maggiore libertà in termini di configurazioni supportate e una maggiore flessibilità in termini di hosting dei servizi. In .NET Framework 3.5, i client e i servizi erano strettamente collegati; un client doveva conoscere tutti i servizi con cui doveva comunicare e la loro posizione. WCF in .NET Framework 3.5 aveva inoltre le limitazioni seguenti:

  • La gestione degli errori era complessa, in quanto la logica doveva essere impostata come hardcoded nel client.

  • I client e i servizi dovevano usare sempre le stesse associazioni.

  • I servizi venivano adeguatamente diversificati molto raramente: è più facile far comunicare il client con un servizio che implementa tutto piuttosto che dover scegliere tra più servizi.

Il servizio di routing in .NET 4 è progettato per semplificare la risoluzione di questi problemi. Il nuovo servizio di routing offre le funzionalità seguenti:

  1. Routing basato sul contenuto (gli oggettiMessageFilter esaminano un messaggio per stabilire dove deve essere inviato).

  2. Bridging del protocollo (trasporto e messaggio)

  3. Gestione degli errori (il router intercetta le eccezioni di comunicazione ed esegue il failover sugli endpoint di backup)

  4. Aggiornamento dinamico (in memoria) di MessageFilterTable<TFilterData> e configurazione del routing.

Introduzione

  1. Documentazione: Routing

  2. Esempi: Servizi di routing [esempi WCF]

  3. Blog: Le regole del routing

Scenari di routing

Il servizio di routing è utile negli scenari seguenti:

  • I client possono comunicare con più servizi senza doverli indirizzare tutti direttamente.

  • I client possono eseguire una logica aggiuntiva su una richiesta del client per determinare dove indirizzarlo.

  • È possibile decomporre le operazioni eseguite da un client in più implementazioni del servizio senza eseguire il refactoring del client.

  • I client e i servizi possono supportare associazioni diverse con impostazioni di sicurezza diverse.

  • È possibile rendere i client più affidabili in caso di guasto o indisponibilità dei servizi.

WCF Discovery

WCF Discovery è una tecnologia del framework che consente di integrare un meccanismo di individuazione nell'infrastruttura dell'applicazione. È possibile usarlo per rendere individuabile il servizio e configura i client per la ricerca dei servizi. Non è più necessario impostare i clienti come hardcoded con gli endpoint, pertanto l'applicazione è più affidabile e garantisce una maggiore tolleranza agli errori. Discovery è la piattaforma ideale per integrare funzionalità di configurazione automatica nell'applicazione.

Il prodotto si basa sullo standard WS-Discovery ed è progettato per essere interoperativo, estendibile e generico. Il prodotto supporta due modalità di funzionamento:

  1. Gestito: se sulla rete esiste un'entità informata sui servizi esistenti, i client eseguono direttamente una query per ottenere le informazioni. È analogo ad Active Directory.

  2. Ad hoc: in questa modalità i client usano messaggi multicast per individuare i servizi.

Inoltre, i messaggi di individuazione non riconoscono il protocollo di rete; è possibile usarli in aggiunta a qualsiasi protocollo che supporta i requisiti della modalità. Ad esempio, è possibile inviare messaggi multicast di individuazione sul canale UDP o su qualsiasi altra rete che supporta la messaggistica multicast. Grazie a questi punti di progettazione e alla flessibilità della funzionalità, è possibile adattare l'individuazione in modo specifico alla soluzione.

Introduzione

Scenari relativi all'individuazione

Un sviluppatore non desidera impostare gli endpoint come hardcoded, in quanto non è possibile sapere quando sarà disponibile il servizio. Al contrario, lo sviluppatore desidera scegliere un servizio in fase di esecuzione. I componenti dell'applicazione devono essere più separabili, più affidabili e autoconfigurabili.

Rilevamento

Il rilevamento del flusso di lavoro consente di analizzare in dettaglio l'esecuzione di un'istanza del flusso di lavoro. Gli eventi di rilevamento vengono generati da un flusso di lavoro a livello dell'istanza del flusso di lavoro e durante l'esecuzione delle attività nel flusso di lavoro. Per sottoscrivere i record di rilevamento, è necessario aggiungere all'host del flusso di lavoro un partecipante del rilevamento del flusso di lavoro. I record di rilevamento vengono filtrati usando un profilo di rilevamento. .NET Framework fornisce un partecipante del rilevamento ETW (Event Tracing for Windows) e nel file machine.config. viene installato un profilo di base.

Introduzione

  1. In Visual Studio 2010, creare un progetto Applicazione di servizi flusso di lavoro WCF. Inizialmente, nel canvas verrà posizionata la coppia Receive e SendReply.

  2. Aprire web.config e aggiungere un comportamento di rilevamento ETW senza profilo.

    1. Viene usato il profilo predefinito.

    2. Aprire il visualizzatore eventi e attivare il canale analitico nel nodo seguente: Visualizzatore eventi, Registri applicazioni e servizi, Microsoft, Windows, Server applicazioni-Applicazioni. Fare clic con il pulsante destro del mouse su Analitico e scegliere Abilita log.

    3. Eseguire il servizio del flusso di lavoro.

    4. Osservare gli eventi di rilevamento del flusso di lavoro nel visualizzatore eventi.

  3. Esempi: Rilevamento

  4. Documentazione concettuale: Rilevamento e traccia del flusso di lavoro

Archivio di istanze del flusso di lavoro SQL

SqlWorkflowInstanceStore è un'implementazione basata su server SQL di un archivio di istanze. In un archivio di istanze è memorizzato lo stato di un'istanza in esecuzione nonché tutti i dati necessari per caricare e riprendere l'esecuzione di quell'istanza. L'host del servizio indica all'archivio di istanze di salvare lo stato dell'istanza se il flusso di lavoro è persistente e di caricare lo stato dell'istanza all'arrivo di un messaggio per quell'istanza o alla scadenza di un'attività di ritardo.

Introduzione

  1. In Visual Studio 2012, creare un flusso di lavoro che contiene un'attività Persist implicita o esplicita. Aggiungere il comportamento SqlWorkflowInstanceStore all'host del servizio del flusso di lavoro. Questa operazione può essere eseguita nel codice o nel file di configurazione dell'applicazione.

  2. Esempi: Persistenza

  3. Documentazione concettuale: Archivio di istanze del flusso di lavoro SQL .