Utilizzo di WorkflowIdentity e controllo delle versioni

WorkflowIdentity offre agli sviluppatori di applicazioni flusso di lavoro un modo per associare un nome e un elemento Version a una definizione del flusso di lavoro. Consente inoltre di associare queste informazioni a un'istanza persistente del flusso di lavoro. Queste informazioni di identità possono essere usate dagli sviluppatori di applicazioni flusso di lavoro per scenari quali l'esecuzione affiancata di più versioni di una definizione del flusso di lavoro e costituiscono un elemento fondamentale per altre funzionalità come l'aggiornamento dinamico. In questo argomento viene fornita una panoramica sull'utilizzo di WorkflowIdentity con hosting WorkflowApplication. Per informazioni sull'esecuzione side-by-side delle definizioni del flusso di lavoro in un servizio flusso di lavoro, vedere Gestione di più versioni in WorkflowServiceHost. Per informazioni sull'aggiornamento dinamico, vedere Aggiornamento dinamico.

Contenuto dell'argomento

Uso di WorkflowIdentity

Per usare WorkflowIdentity, creare un'istanza, configurarla e associarla a un'istanza di WorkflowApplication. L'istanza di WorkflowIdentity contiene tre informazioni di identificazione. Le proprietà Name e Version contengono un nome e un oggetto Version e sono obbligatorie, mentre la proprietà Package è facoltativa e può essere usata per specificare una stringa aggiuntiva che contiene informazioni quali il nome dell'assembly o altre informazioni desiderate. Un oggetto WorkflowIdentity è univoco se una qualsiasi delle tre relative proprietà è diversa da un altro oggetto WorkflowIdentity.

Importante

WorkflowIdentity non deve contenere eventuali informazioni identificabili personalmente (PII). Le informazioni su WorkflowIdentity usate per creare un'istanza vengono generate a tutti i servizi di rilevamento configurati in vari punti del ciclo di vita di attività dal runtime. La verifica di WF non ha alcun meccanismo per nascondere i PII (dati riservati dell'utente). Di conseguenza, un'istanza di WorkflowIdentity non deve contenere dati di PII poiché verrebbe generata dal runtime nei record di rilevamento e può essere visibile agli utenti con accesso alla visualizzazione dei record di rilevamento.

Nell'esempio riportato di seguito, un oggetto WorkflowIdentity viene creato e associato a un'istanza di un flusso di lavoro creato usando una definizione del flusso di lavoro di MortgageWorkflow.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Quando un flusso di lavoro viene nuovamente caricato e ripreso, è necessario usare un oggetto WorkflowIdentity configurato per corrispondere all'oggetto WorkflowIdentity dell'istanza persistente del flusso di lavoro.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

Se l'oggetto WorkflowIdentity usato durante la ricarica dell'istanza del flusso di lavoro non corrisponde l'oggetto WorkflowIdentity persistente, viene generata un'eccezione VersionMismatchException. Nell'esempio riportato di seguito viene effettuato un tentativo di caricamento dell'istanza di MortgageWorkflow che è stata resa persistente nell'esempio precedente. Questo tentativo di caricamento viene eseguito mediante WorkflowIdentity configurato per una versione più recente del flusso di lavoro relativo a un'ipoteca che non corrisponde all'istanza persistente.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

Quando viene eseguito il codice precedente, viene generata la seguente eccezione VersionMismatchException.

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

Esecuzione side-by-side con WorkflowIdentity

WorkflowIdentity può essere usato per facilitare l'esecuzione di più versioni di un flusso di lavoro affiancate. Uno scenario comune consiste nella modifica dei requisiti aziendali in un flusso di lavoro di lunga durata. Molte istanze di un flusso di lavoro potrebbero essere in esecuzione quando una versione aggiornata viene distribuita. L'applicazione host può essere configurata per usare la definizione aggiornata del flusso di lavoro all'avvio di nuove istanze. È responsabilità dell'applicazione host fornire la definizione del flusso di lavoro corretta quando vengono riprese le istanze. WorkflowIdentity può essere usato per identificare e fornire la definizione corrispondente del flusso di lavoro quando vengono riprese le istanze del flusso di lavoro.

Per recuperare l'oggetto WorkflowIdentity di un'istanza persistente del flusso di lavoro, viene usato il metodo GetInstance. Il metodo GetInstance accetta l'oggetto Id dell'istanza persistente del flusso di lavoro e l'oggetto SqlWorkflowInstanceStore contenente l'istanza persistente e restituisce un oggetto WorkflowApplicationInstance. Un oggetto WorkflowApplicationInstance contiene informazioni su un'istanza persistente del flusso di lavoro, incluso il relativo oggetto WorkflowIdentity associato. Questo oggetto WorkflowIdentity associato può essere usato dall'host per fornire la definizione del flusso di lavoro corretta durante il caricamento e la ripresa dell'istanza del flusso di lavoro.

Nota

Un oggetto WorkflowIdentity null è valido e può essere usato dall'host per eseguire il mapping delle istanze che sono state salvate in modo permanente senza alcun WorkflowIdentity associato alla definizione appropriata del flusso di lavoro. Questo scenario può verificarsi quando un'applicazione flusso di lavoro non è stata inizialmente scritta con il controllo delle versioni del flusso di lavoro o quando un'applicazione viene aggiornata da .NET Framework 4. Per altre informazioni, vedere Aggiornamento dei database di persistenza di .NET Framework 4 per supportare il controllo delle versioni del flusso di lavoro.

Nell'esempio riportato di seguito viene usato Dictionary<WorkflowIdentity, Activity> per associare le istanze di WorkflowIdentity alle definizioni corrispondenti del flusso di lavoro; viene inoltre avviato un flusso di lavoro usando la definizione del flusso di lavoro MortgageWorkflow, che è associata all'oggetto WorkflowIdentityidentityV1.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Nell'esempio riportato di seguito, le informazioni sull'istanza persistente del flusso di lavoro derivante dall'esempio precedente vengono recuperate chiamando il metodo GetInstance; le informazioni relative all'oggetto WorkflowIdentity persistente vengono usate per recuperare la definizione corrispondente del flusso di lavoro. Queste informazioni vengono usate per configurare WorkflowApplication, quindi il flusso di lavoro viene caricato. Si noti che dal momento che viene usato l'overload Load che accetta WorkflowApplicationInstance, l'oggetto SqlWorkflowInstanceStore che era configurato nell'oggetto WorkflowApplicationInstance viene usato da WorkflowApplication, di conseguenza la relativa proprietà InstanceStore non necessita di configurazione.

Nota

Se la proprietà InstanceStore è impostata, deve essere impostata con la stessa istanza di SqlWorkflowInstanceStore usata da WorkflowApplicationInstance, altrimenti verrà generata un'eccezione ArgumentException con il messaggio seguente: The instance is configured with a different InstanceStore than this WorkflowApplication..

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

Aggiornamento dei database di persistenza di .NET Framework 4 per supportare il controllo delle versioni del flusso di lavoro

Lo script di database SqlWorkflowInstanceStoreSchemaUpgrade.sql viene fornito per aggiornare i database di persistenza creati mediante gli script di database di .NET Framework 4. Questo script aggiorna i database per supportare le nuove funzionalità di controllo delle versioni introdotte in .NET Framework 4.5. Le istanze persistenti del flusso di lavoro nei database sono valori predefiniti specificati per il controllo delle versioni e quindi possono partecipare all'esecuzione side-by-side e all'aggiornamento dinamico.

Se un'applicazione di flusso di lavoro di .NET Framework 4.5 tenta un'operazione di persistenza che usa le nuove funzionalità di controllo delle versioni in un database di persistenza che non è stato aggiornato mediante lo script fornito, viene generata l'eccezione InstancePersistenceCommandException con un messaggio simile al seguente.

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

Per aggiornare lo schema di database

  1. Aprire SQL Server Management Studio e connettersi al server di database di persistenza, ad esempio .\SQLEXPRESS.

  2. Scegliere Apri, quindi File dal menu File. Passare alla cartella seguente: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Selezionare SqlWorkflowInstanceStoreSchemaUpgrade.sql e fare clic su Apri.

  4. Selezionare il nome del database di persistenza nell'elenco a discesa Database disponibili.

  5. Scegliere Esegui dal menu Query.

Quando la query viene completata, lo schema di database verrà aggiornato e, se necessario, è possibile visualizzare l'identità predefinita del flusso di lavoro assegnata alle istanze persistenti del flusso di lavoro. In Esplora oggetti espandere il database di persistenza nel nodo Database, quindi espandere il nodo Viste. Fare clic con il pulsante destro del mouse su System.Activities.DurableInstancing.Instances e scegliere Seleziona le prime 1000 righe. Scorrere fino alla fine delle colonne e notare che sei ulteriori colonne sono state aggiunte alla vista: IdentityName, IdentityPackage, Build, Major, Minor e Revision. Tutti i flussi di lavoro persistenti avranno il valore NULL per questi campi, a rappresentazione di un'identità Null del flusso di lavoro.