Utilizzo di WorkflowIdentity e controllo delle versioniUsing WorkflowIdentity and Versioning

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.WorkflowIdentity provides a way for workflow application developers to associate a name and a Version with a workflow definition, and for this information to be associated with a persisted workflow instance. 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.This identity information can be used by workflow application developers to enable scenarios such as side-by-side execution of multiple versions of a workflow definition, and provides the cornerstone for other functionality such as dynamic update. In questo argomento viene fornita una panoramica sull'utilizzo di WorkflowIdentity con hosting WorkflowApplication.This topic provides as overview of using WorkflowIdentity with WorkflowApplication hosting. Per informazioni sull'esecuzione side-by-side di definizioni di flusso di lavoro in un servizio flusso di lavoro, vedere Side-by-Side più versioni in WorkflowServiceHost.For information on side-by-side execution of workflow definitions in a workflow service, see Side by Side Versioning in WorkflowServiceHost. Per informazioni sull'aggiornamento dinamico, vedere aggiornamento dinamico.For information on dynamic update, see Dynamic Update.

Contenuto dell'argomentoIn this topic

Uso di WorkflowIdentityUsing WorkflowIdentity

Per usare WorkflowIdentity, creare un'istanza, configurarla e associarla a un'istanza di WorkflowApplication.To use WorkflowIdentity, create an instance, configure it, and associate it with a WorkflowApplication instance. L'istanza di WorkflowIdentity contiene tre informazioni di identificazione.A WorkflowIdentity instance contains three identifying pieces of information. 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.Name and Version contain a name and a Version and are required, and Package is optional and can be used to specify an additional string containing information such as assembly name or other desired information. Un oggetto WorkflowIdentity è univoco se una qualsiasi delle tre relative proprietà è diversa da un altro oggetto WorkflowIdentity.A WorkflowIdentity is unique if any of its three properties are different from another WorkflowIdentity.

Importante

WorkflowIdentity non deve contenere eventuali informazioni identificabili personalmente (PII).A WorkflowIdentity should not contain any personally identifiable information (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.Information about the WorkflowIdentity used to create an instance is emitted to any configured tracking services at several different points of the activity life-cycle by the runtime. La verifica di WF non ha alcun meccanismo per nascondere i PII (dati riservati dell'utente).WF Tracking does not have any mechanism to hide PII (sensitive user data). 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.Therefore, a WorkflowIdentity instance should not contain any PII data as it will be emitted by the runtime in tracking records and may be visible to anyone with access to view the tracking records.

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.In the following example, a WorkflowIdentity is created and associated with an instance of a workflow created using a MortgageWorkflow workflow definition.

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.When reloading and resuming a workflow, a WorkflowIdentity that is configured to match the WorkflowIdentity of the persisted workflow instance must be used.

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.If the WorkflowIdentity used when reloading the workflow instance does not match the persisted WorkflowIdentity, a VersionMismatchException is thrown. Nell'esempio riportato di seguito viene effettuato un tentativo di caricamento dell'istanza di MortgageWorkflow che è stata resa persistente nell'esempio precedente.In the following example a load attempt is made on the MortgageWorkflow instance that was persisted in the previous example. 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.This load attempt is made using a WorkflowIdentity configured for a newer version of the mortgage workflow that does not match the persisted instance.

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.When the previous code is executed, the following VersionMismatchException is thrown.

L'elemento WorkflowIdentity ("MortgageWorkflow v1; Versione = 1.0.0.0") dell'istanza caricata non corrisponde all'elemento WorkflowIdentity (" MortgageWorkflow v2; Versione = 2.0.0.0") della definizione del flusso di lavoro fornita. L'istanza può essere caricata mediante una definizione diversa o aggiornata mediante l'aggiornamento dinamico.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 usando WorkflowIdentitySide-by-side Execution using WorkflowIdentity

WorkflowIdentity può essere usato per facilitare l'esecuzione di più versioni di un flusso di lavoro affiancate.WorkflowIdentity can be used to facilitate the execution of multiple versions of a workflow side-by-side. Uno scenario comune consiste nella modifica dei requisiti aziendali in un flusso di lavoro di lunga durata.One common scenario is changing business requirements on a long-running workflow. Molte istanze di un flusso di lavoro potrebbero essere in esecuzione quando una versione aggiornata viene distribuita.Many instances of a workflow could be running when an updated version is deployed. 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.The host application can be configured to use the updated workflow definition when starting new instances, and it is the responsibility of the host application to provide the correct workflow definition when resuming instances. WorkflowIdentity può essere usato per identificare e fornire la definizione corrispondente del flusso di lavoro quando vengono riprese le istanze del flusso di lavoro.WorkflowIdentity can be used to identify and supply the matching workflow definition when resuming workflow instances.

Per recuperare l'oggetto WorkflowIdentity di un'istanza persistente del flusso di lavoro, viene usato il metodo GetInstance.To retrieve the WorkflowIdentity of a persisted workflow instance, the GetInstance method is used. 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.The GetInstance method takes the Id of the persisted workflow instance and the SqlWorkflowInstanceStore that contains the persisted instance and returns a WorkflowApplicationInstance. Un oggetto WorkflowApplicationInstance contiene informazioni su un'istanza persistente del flusso di lavoro, incluso il relativo oggetto WorkflowIdentity associato.A WorkflowApplicationInstance contains information about a persisted workflow instance, including its associated WorkflowIdentity. 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.This associated WorkflowIdentity can be used by the host to supply the correct workflow definition when loading and resuming the workflow instance.

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.A null WorkflowIdentity is valid, and can be used by the host to map instances that were persisted with no associated WorkflowIdentity to the proper workflow definition. Questo scenario può verificarsi quando un'applicazione flusso di lavoro inizialmente non è stata scritta con il controllo delle versioni del flusso di lavoro o quando un'applicazione viene aggiornata da .NET Framework 4.NET Framework 4.This scenario can occur when a workflow application was not initially written with workflow versioning, or when an application is upgraded from .NET Framework 4.NET Framework 4. Per altre informazioni, vedere l'aggiornamento di .NET Framework 4 i database di persistenza al controllo delle versioni del flusso di lavoro di supporto.For more information, see Upgrading .NET Framework 4 Persistence Databases to Support Workflow Versioning.

Nell'esempio seguente un Dictionary<WorkflowIdentity, Activity> viene utilizzato per associare WorkflowIdentity istanze con le relative definizioni del flusso di lavoro corrispondente e un flusso di lavoro viene avviato utilizzando il MortgageWorkflow definizione flusso di lavoro, il quale è associato il identityV1 WorkflowIdentity.In the following example a Dictionary<WorkflowIdentity, Activity> is used to associate WorkflowIdentity instances with their matching workflow definitions, and a workflow is started using the MortgageWorkflow workflow definition, which is associated with the identityV1 WorkflowIdentity.

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.In the following example, information about the persisted workflow instance from the previous example is retrieved by calling GetInstance, and the persisted WorkflowIdentity information is used to retrieve the matching workflow definition. Queste informazioni vengono usate per configurare WorkflowApplication, quindi il flusso di lavoro viene caricato.This information is used to configure the WorkflowApplication, and then the workflow is loaded. 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.Note that because the Load overload that takes the WorkflowApplicationInstance is used, the SqlWorkflowInstanceStore that was configured on the WorkflowApplicationInstance is used by the WorkflowApplication and therefore its InstanceStore property does not need to be configured.

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..If the InstanceStore property is set, it must be set with the same SqlWorkflowInstanceStore instance used by the WorkflowApplicationInstance or else an ArgumentException will be thrown with the following message: 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 del database di persistenza 4 di .NET Framework per supportare il controllo delle versioni del flusso di lavoroUpgrading .NET Framework 4 Persistence Databases to Support Workflow Versioning

Uno script del database SqlWorkflowInstanceStoreSchemaUpgrade.sql viene fornito per aggiornare i database di persistenza creati mediante gli script del database di .NET Framework 4.NET Framework 4.A SqlWorkflowInstanceStoreSchemaUpgrade.sql database script is provided to upgrade persistence databases created using the .NET Framework 4.NET Framework 4 database scripts. Questo script aggiorna i database per supportare nuove funzionalità di controllo delle versioni introdotte in .NET Framework 4.5.NET Framework 4.5.This script updates the databases to support the new versioning capabilities introduced in .NET Framework 4.5.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.Any persisted workflow instances in the databases are given default versioning values, and can then participate in side-by-side execution and dynamic update.

Se un'applicazione flusso di lavoro .NET Framework 4.5.NET Framework 4.5 tenta un'operazione di persistenza che usa il nuovo 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.If a .NET Framework 4.5.NET Framework 4.5 workflow application attempts any persistence operations that use the new versioning features on a persistence database which has not been upgraded using the provided script, an InstancePersistenceCommandException is thrown with a message similar to the following message.

L'elemento SqlWorkflowInstanceStore ha una versione di database di '4.0.0.0'. Impossibile eseguire InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' in relazione a questa versione di database. Aggiornare il database a '4.5.0.0'.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 del databaseTo upgrade the database schema

  1. Aprire SQL Server Management Studio e connettersi al server di database di persistenza, ad esempio . \SQLEXPRESS.Open SQL Server Management Studio and connect to the persistence database server, for example .\SQLEXPRESS.

  2. Scegliere aprire, File dal File menu.Choose Open, File from the File menu. Passare alla cartella seguente: C:\Windows\Microsoft.NET\Framework\4.0.30319\sql\enBrowse to the following folder: C:\Windows\Microsoft.NET\Framework\4.0.30319\sql\en

  3. Selezionare SqlWorkflowInstanceStoreSchemaUpgrade.sql e fare clic su aprire.Select SqlWorkflowInstanceStoreSchemaUpgrade.sql and click Open.

  4. Selezionare il nome del database di persistenza nel database disponibili elenco a discesa.Select the name of the persistence database in the Available Databases drop-down.

  5. Scegliere Execute dal Query menu.Choose Execute from the Query menu.

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.When the query completes, the database schema is upgraded, and if desired, you can view the default workflow identity that was assigned to the persisted workflow instances. Espandere il database di persistenza nel database nodo del Esplora oggetti, quindi espandere il viste nodo.Expand your persistence database in the Databases node of the Object Explorer, and then expand the Views node. Fare doppio clic su System.Activities.DurableInstancing.Instances e scegliere seleziona le prime 1000 righe.Right-click System.Activities.DurableInstancing.Instances and choose Select Top 1000 Rows. Scorrere fino alla fine delle colonne e notare che ci sono sei ulteriori colonne aggiunte alla vista: IdentityName, IdentityPackage, compilare, principali , Secondaria, e revisione.Scroll to end of the columns and note that there are six additional columns added to the view: IdentityName, IdentityPackage, Build, Major, Minor, and Revision. Flussi di lavoro persistente avrà un valore di NULL per questi campi, che rappresenta un'identità null del flusso di lavoro.Any persisted workflows will have a value of NULL for these fields, representing a null workflow identity.