Versioning côte à côte dans WorkflowServiceHost

Le versioning côte à côte WorkflowServiceHost introduit dans .NET Framework 4.5 permet d’héberger plusieurs versions d’un service de workflow sur un seul point de terminaison. Une fonctionnalité côte à côte fournie permet de configurer un service de workflow de façon à ce que les nouvelles instances du service de workflow soient créées à l'aide de la nouvelle définition de workflow, alors que les instances en cours de exécution s'achèvent à l'aide de définition existante. Cette rubrique fournit une vue d'ensemble de l'exécution de service de workflow côte à côte à l'aide de WorkflowServiceHost.

Hébergement de plusieurs versions dans un service de workflow

WorkflowServiceHost contient deux propriétés qui peuvent être configurées pour permettre à plusieurs versions d'un flux de travail de s'exécuter côte à côte : SupportedVersions et DefinitionIdentity. SupportedVersions contient les versions prises en charge du service de workflow, et DefinitionIdentity est utilisé pour identifier chaque service de workflow. Cela est effectué en associant un WorkflowIdentity au service de workflow. 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. Chaque service de workflow contenu de la collection SupportedVersions doit disposer d’un WorkflowIdentity unique. WorkflowIdentity est unique si l'une de ses trois propriétés est différente d'un autre WorkflowIdentity. Un nullWorkflowIdentity est une valeur autorisée pour DefinitionIdentity, mais une seule version antérieure d’un service de workflow peut avoir un nullWorkflowIdentity.

Important

Un WorkflowIdentity ne devrait contenir aucune information d'identification personnelle (PII). Un WorkflowIdentity se compose de trois parties : un Name (String), un Version (Version) et un Package (String). 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.

Règles pour héberger plusieurs versions d'un service de workflow

Lorsqu'un utilisateur ajoute une version supplémentaire à WorkflowServiceHost, il existe plusieurs conditions à respecter pour qu'un service de workflow soit hébergé avec le même ensemble de points de terminaison et de description. Si l'une des versions supplémentaires ne satisfait pas ces conditions, WorkflowServiceHost lève une exception lorsque Open est appelée. Chaque définition de flux de travail fournie à l’hôte comme une version supplémentaire doit satisfaire les exigences suivantes (où la version principale est la définition de service de workflow qui est fournie au constructeur hôte). La version supplémentaire du flux de travail doit :

  • Avoir le même Name que la version principale du service de workflow.

  • Ne doit pas avoir d'activité Receive ou SendReply dans son Body qui ne sont pas dans la version principale, et doit correspondre au contrat d'opération.

  • Avoir un DefinitionIdentity unique. Une seule définition de workflow peut avoir une propriété nullDefinitionIdentity.

Certaines modifications sont autorisées. Les éléments suivants peuvent être différents selon les versions :

Configurer le DefinitionIdentity

Lorsqu’un service de workflow est créé à l’aide du concepteur de workflow, DefinitionIdentity est défini à l’aide de la fenêtre Propriétés. Cliquez en dehors de l’activité racine du service dans le concepteur pour sélectionner le service de workflow, puis choisissez Fenêtre Propriétés dans le menu Affichage. Sélectionnez WorkflowIdentity dans la liste déroulante qui s’affiche en regard de la propriété DefinitionIdentity, puis développez et spécifiez les propriétés WorkflowIdentity voulues. Dans l’exemple suivant, DefinitionIdentity est configuré avec NameMortgageWorkflow et un Version ayant la valeur 1.0.0.0. Package est facultatif et dans cet exemple est null.

Screenshot that shows the DefinitionIdentity property.

Lorsqu'un service de workflow est auto-hébergé, DefinitionIdentity est configuré lorsque le service de workflow est construit. Dans l’exemple suivant, DefinitionIdentity est configuré avec les mêmes valeurs que celles de l’exemple précédent, avec NameMortgageWorkflow et un Name ayant la valeur 1.0.0.0.

WorkflowService service = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflow(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
Dim service As New WorkflowService  
With service  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflow  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  

Un DefinitionIdentity n’est pas obligatoire, même si une seule version du service de workflow peut avoir une valeur DefinitionIdentitynull.

Notes

Cela est utile si le service a été déployé initialement sans DefinitionIdentity configuré, et une version mise à jour est créée.

Ajout d'une nouvelle version à un service de workflow hébergé sur le Web

La première étape de configuration d'une nouvelle version d'un service de flux de travail dans un service hébergé sur le Web consiste à créer un nouveau dossier dans le dossier App_Code portant le même nom que le fichier de service. Si le fichier xamlx du service est nommé MortgageWorkflow.xamlx, le dossier doit être nommé MortgageWorkflow. Placez une copie du fichier xamlx du service initial dans ce dossier et renommez-le, par exemple MortgageWorkflowV1.xamlx. Apportez les modifications souhaitées au service principal, mettez à jour son DefinitionIdentity, puis déployez le service. Dans l'exemple suivant, DefinitionIdentity a été mis à jour avec un Name de MortgageWorkflow et un Version de 2.0.0.0.

Screenshot that shows DefinitionIdentity of WorkflowIdentity.

Lorsque le service redémarre, la version précédente est automatiquement ajoutée à la collection SupportedVersions, car elle se trouve dans le sous-dossier App_Code désigné. Notez que si la version principale du service de workflow a une valeur nullDefinitionIdentity, les versions antérieures ne sont pas ajoutées. Une version peut avoir une propriété nullDefinitionIdentity, mais s’il existe plusieurs versions, la version principale ne doit pas être celle avec la propriété nullDefinitionIdentity, sinon les versions précédentes ne seront pas ajoutées à la collection SupportedVersions.

Ajout d'une nouvelle version à un service de workflow auto-hébergé

Lors de l’ajout d’une nouvelle version à un service de flux de travail auto-hébergé, WorkflowServiceHost est configuré avec la version principale du service de flux de travail, et les versions antérieures doivent être explicitement ajoutées à la collection SupportedVersions. Dans l'exemple suivant, WorkflowServiceHost est configuré avec un service de workflow principal qui utilise une définition de workflow MortgageWorkflowV2, et un service de workflow configuré avec une définition de workflow MortgageWorkflowV1 est ajouté à la collection SupportedVersions. Chaque service de workflow est configuré avec un DefinitionIdentity unique qui reflète la version de la définition de workflow.

// Create the primary version of the workflow service.  
WorkflowService serviceV2 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV2(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(2, 0, 0, 0)  
    }  
};  
  
// Configure the WorkflowServiceHost with the current version  
// of the workflow service. This code requires Administrator  
// privileges to function correctly. If running from Visual  
// Studio, Visual Studio must be run with Administrator privileges.  
WorkflowServiceHost host = new WorkflowServiceHost(serviceV2,
    new Uri("http://localhost:8080/MortgageWorkflowService"));  
  
// Create the previous version of the workflow service.  
WorkflowService serviceV1 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV1(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
  
// Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1);  
'Create the primary version of the workflow service  
Dim serviceV2 As New WorkflowService  
With serviceV2  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV2  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(2, 0, 0, 0) _  
    }  
End With  
  
'Configure the WorkflowServiceHost with the current version  
'of the workflow service. This code requires Administrator  
'privileges to function correctly. If running from Visual  
'Studio, Visual Studio must be run with Administrator privileges.  
  
Dim host As New WorkflowServiceHost(serviceV2, _  
    New Uri("http://localhost:8080/MortgageWorkflowService"))  
  
'Create the previous version of the workflow service.  
Dim serviceV1 As New WorkflowService  
With serviceV1  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV1  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  
  
'Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1)