Utilisation de WorkflowIdentity et du versioning

WorkflowIdentity permet aux développeurs d'applications de workflow d'associer un nom et un Version à une définition de workflow, et d'associer ces informations à une instance persistante de workflow. Ces informations d'identité peuvent être utilisées par les développeurs d'applications de workflow pour activer des scénarios tels que l'exécution côte à côte de plusieurs versions d'une définition de workflow, et fournir la base d'autres fonctionnalités telles que la mise à jour dynamique. Cette rubrique fournit une vue d'ensemble de l'utilisation de WorkflowIdentity avec l'hébergement WorkflowApplication. Pour plus d’informations sur l’exécution côte à côte des définitions de workflows dans un service de workflows, consultez Versioning côte à côte dans WorkflowServiceHost. Pour plus d’informations sur la mise à jour dynamique, consultez Mise à jour dynamique.

Dans cette rubrique

Utilisation de WorkflowIdentity

Pour utiliser WorkflowIdentity, créez une instance, configurez-la et associez-la à une instance WorkflowApplication. Une instance WorkflowIdentity contient trois informations d'identification. Name et Version contiennent un nom et un Version et sont obligatoire, et Package est facultatif et peut être utilisé pour spécifier une chaîne supplémentaire contenant des informations telles que le nom de l'assembly ou d'autres informations souhaitées. WorkflowIdentity est unique si l'une de ses trois propriétés est différente d'un autre WorkflowIdentity.

Important

Un WorkflowIdentity ne devrait contenir aucune information d'identification personnelle (PII). Les informations relatives au WorkflowIdentity utilisées pour créer une instance sont émises vers n'importe quel service de suivi configuré sur plusieurs points du cycle de vie du workflow différents par le runtime. Le suivi WF ne dispose pas d'un mécanisme de masquage des informations PII (données utilisateur sensibles). Par conséquent, une instance WorkflowIdentity ne doit contenir aucune donnée PII, car elle est émise par le runtime dans les enregistrements de suivi et peut être vue par n'importe quelle personne qui dispose d'un accès permettant d'afficher les enregistrements de suivi.

Dans l'exemple suivant, un WorkflowIdentity est créé et associé à une instance d'un workflow créée à l'aide d'une définition de workflow 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();

Lors du rechargement et de la reprise d'un workflow, un WorkflowIdentity, configuré pour correspondre à WorkflowIdentity de l'instance persistante de workflow doit être utilisé.

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...

Si WorkflowIdentity utilisé pour recharger l'instance du workflow ne correspond pas au WorkflowIdentity persistant, une exception VersionMismatchException est levée. Dans l'exemple suivant, une tentative de chargement est faite sur l'instance MortgageWorkflow qui a été rendue persistante dans l'exemple précédent. Cette tentative de chargement est effectuée à l'aide de WorkflowIdentity configuré pour une version plus récente du workflow d'emprunts qui ne correspond pas à l'instance persistante.

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...

Lorsque le code précédent est exécuté, l'exception VersionMismatchException suivante est levée.

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.

Exécution côte à côte à l'aide de WorkflowIdentity

WorkflowIdentity peut être utilisé pour faciliter l'exécution de plusieurs versions d'un workflow côte à côte. Un scénario courant modifie les besoins de l'entreprise sur un workflow de longue durée. De nombreuses instances d'un workflow peuvent s'exécuter lorsqu'une version mise à jour est déployée. L'application hôte peut être configurée pour utiliser la définition mise à jour de workflow lors du démarrage de nouvelles instances, et il est de la responsabilité de l'application hôte de fournir la définition correcte de workflow lors de la reprise des instances. WorkflowIdentity peut être utilisé pour identifier et fournir la définition correspondante de workflow lors de la reprise des instances de workflow.

Pour récupérer le WorkflowIdentity d'une instance persistante de workflow, la méthode GetInstance est utilisée. La méthode GetInstance prend le Id de l'instance persistante de workflow et le SqlWorkflowInstanceStore qui contient l'instance rendue persistante et retourne un WorkflowApplicationInstance. Un WorkflowApplicationInstance contient des informations sur une instance persistante de workflow, y compris son WorkflowIdentity associé. Ce WorkflowIdentity associé peut être utilisé par l'hôte pour fournir la définition correcte de workflow lors du chargement et de la reprise de l'instance de workflow.

Notes

Un WorkflowIdentity null est valide, et peut être utilisé par l'hôte pour mapper les instances qui ont été rendues persistantes sans WorkflowIdentity associé à la définition appropriée de workflow. Ce scénario peut se produire lorsqu’une application de workflow n’a pas été écrite initialement avec versioning de workflow, ou lorsqu’une application est mise à niveau à partir du .NET Framework 4. Pour plus d’informations, consultez Mise à niveau des bases de données de persistance .NET Framework 4 pour prendre en charge le versioning de workflow.

Dans l’exemple suivant, un Dictionary<WorkflowIdentity, Activity> est utilisé pour associer des instances WorkflowIdentity à leurs définitions correspondantes de workflow, et un workflow est lancé à l’aide de la définition de workflow MortgageWorkflow, qui est associée à identityV1WorkflowIdentity.

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();

Dans l'exemple suivant, les informations sur l'instance persistante de workflow de l'exemple précédent sont récupérées en appelant GetInstance, et les informations WorkflowIdentity persistantes sont utilisées pour récupérer la définition correspondante de workflow. Ces informations sont utilisées pour configurer WorkflowApplication, puis le workflow est chargé. Étant donné que la surcharge Load qui prend WorkflowApplicationInstance est utilisée, SqlWorkflowInstanceStore qui a été configuré sur WorkflowApplicationInstance est utilisé par WorkflowApplication et par conséquent sa propriété InstanceStore n'a pas besoin d'être configurée.

Notes

Si la propriété InstanceStore est définie, elle doit être définie avec la même instance SqlWorkflowInstanceStore que celle utilisée par WorkflowApplicationInstance, sinon une exception ArgumentException sera levée avec le message suivant : 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...

Mise à niveau des bases de données de persistance .NET Framework 4 pour prendre en charge le versioning de workflow

Le script de base de données SqlWorkflowInstanceStoreSchemaUpgrade.sql est fourni pour mettre à niveau les bases de données de persistance créées à l’aide de scripts de base de données .NET Framework 4. Ce script met à jour les bases de données pour prendre en charge les nouvelles fonctions de versioning introduites dans .NET Framework 4.5. Des valeurs de versioning par défaut sont attribuées à toutes les instances persistantes de workflow dans les bases de données et ces instances peuvent ensuite participer côte à côte à l'exécution et à la mise à jour dynamique.

Si une application de workflow .NET Framework 4.5 tente d’effectuer une opération de persistance qui utilise les nouvelles fonctionnalités de versioning sur une base de données de persistance qui n’a pas été mise à niveau à l’aide du script indiqué, une exception InstancePersistenceCommandException est levée avec un message similaire au message suivant.

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'.

Pour mettre à niveau le schéma de base de données

  1. Ouvrez SQL Server Management Studio et connectez-vous au serveur de base de données de persistance, par exemple .\SQLEXPRESS.

  2. Dans le menu Fichier, sélectionnez Ouvrir, puis cliquez sur Fichier. Accédez au dossier suivant : C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Sélectionnez SqlWorkflowInstanceStoreSchemaUpgrade.sql et cliquez sur Ouvrir.

  4. Sélectionnez le nom de la base de données de persistance dans la liste déroulante Bases de données disponibles.

  5. Dans le menu Requête, choisissez Exécuter.

Lorsque la requête est terminée, le schéma de base de données est mis à niveau, et si vous le souhaitez, vous pouvez afficher l'identité du workflow par défaut affectée aux instances persistantes de workflow. Dans l’Explorateur d’objets, développez le nœud Bases de données de votre base de données de persistance, puis développez le nœud Vues. Cliquez avec le bouton droit sur System.Activities.DurableInstancing.Instances et choisissez Sélectionner les 1000 lignes du haut. Faites défiler jusqu’à la fin des colonnes et notez qu’il y a six colonnes supplémentaires ajoutées à la vue : IdentityName, IdentityPackage, Build, Principale, Secondaire et Révision. Les workflows persistants auront une valeur Null pour ces champs, qui représente une identité de workflow Null.