Tâche 1 : créer le service de workflow
Dans cette tâche, vous créez un service de workflow d'ordinateur d'état de base qui implémente un contrat Windows Communication Foundation (WCF) et rend les informations d'état du service persistantes dans une base de données SQL. Cette tâche est effectuée via le style de création de « contrat en premier ».
Remarque : |
---|
Ce service de workflow sera utilisé dans les exercices restants de ce didacticiel. |
Remarque : |
---|
Lorsque le concepteur de flux de travail de Visual Studio est utilisé pour créer ou gérer des services de flux de travail, il produit parfois des erreurs de validation parasites. Si vous êtes en mesure de générer correctement le projet, ignorez les erreurs de validation. |
Pour installer le service de workflow et définir le contrat
Ouvrez Visual Studio 2008, cliquez sur Fichieret sélectionnez Nouveau, puis Projet.
Dans la boîte de dialogue Nouveau projet, sous WCF, sélectionnez le modèle Bibliothèque du service de workflow de l'ordinateur d'état.
Nommez le projet WorkflowServiceTutorial et cliquez sur OK.
Visual Studio 2008 génère les fichiers suivants pour le service de workflow : un fichier App.config pour stocker des paramètres de configuration à l'aide du même schéma utilisé pour les services WCF, un fichier source qui contient une définition du contrat et les fichiers source de classe de workflow qui définissent le code de concepteur et le code d'implémentation du workflow.
Le modèle crée un workflow d'ordinateur d'état avec deux activités StateActivity. La première activité StateActivity, nommée Workflow1InitialState, contient une activité EventDrivenActivity qui elle-même contient une activité ReceiveActivity, suivie d'une activité SetStateActivity. La propriété TargetStateName de l'activité SetStateActivity a la valeur du nom de l'autre activité StateActivity dans le workflow d'ordinateur d'état.
Le type ReceiveActivity lui-même dérive de SequenceActivity et, ainsi, peut contenir plusieurs activités enfants qui s'exécutent en ordre séquentiel. L'implémentation d'une activité ReceiveActivity correspond à l'implémentation d'une opération sur un service WCF standard, mais au lieu d'implémenter le code dans le corps d'une méthode, vous implémentez les actions via les activités WF.
Les activités ReceiveActivity de ce didacticiel implémentent plusieurs nouvelles opérations définies dans IWorkflow1.cs (ou IWorkflow1.vb si vous avez créé une solution Visual Basic). Ce sont des opérations de demande/réponse ; par conséquent, le client recevra un message du service.
Dans la mesure où vous utilisez un contrat WCF qui est déjà fourni, cette opération est appelée style de création d'un service de workflow « contrat en premier ». Si vous souhaitez créer un contrat par programme, consultez How to: Implement a Windows Communication Foundation Contract Operation.
Puisque que vous allez définir de nouvelles opérations sur l'interface, ouvrez IWorkflow1.cs (ou IWorkflow1.vb si vous avez créé une solution Visual Basic) et remplacez la définition d'interface existante par le code de l'exemple suivant :
<ServiceContract()> _ Public Interface IWorkflow1 <OperationContract()> _ Sub StartupService() <OperationContract()> _ Function Add(ByVal n1 As Integer) As Integer <OperationContract()> _ Function Subtract(ByVal n1 As Integer) As Integer <OperationContract()> _ Function Multiply(ByVal n1 As Integer) As Integer <OperationContract()> _ Function Divide(ByVal n1 As Integer) As Integer <OperationContract()> _ Sub ShutdownService() End Interface
[ServiceContract] public interface IWorkflow1 { [OperationContract] void StartupService(); [OperationContract] int Add(int n1); [OperationContract] int Subtract(int n1); [OperationContract] int Multiply(int n1); [OperationContract] int Divide(int n1); [OperationContract] void ShutdownService(); }
Pour implémenter le contrat de service
Si le concepteur de workflow n'est pas visible, ouvrez-le en cliquant avec le bouton droit sur Workflow1.cs (ou Workflow1.vb si vous avez créé une solution Visual Basic) et sélectionnez Concepteur de vues.
Faites glisser une activité StateActivity dans le workflow d'ordinateur d'état. Renommez-la OperationsState.
Renommez stateActivity1 en tant que FinalState.
Remarque : Lorsque vous renommez cette activité, elle n'est plus signalée comme l'état terminé du workflow ; par conséquent, cliquez avec le bouton droit sur FinalState dans le concepteur de workflow et sélectionnez Définir en tant qu'état terminé. Dans l'activité StateActivity nommée Workflow1InitialState, sélectionnez eventDrivenActivity1 et renommez-la WaitToStartService.
Double-cliquez sur WaitToStartService pour la développer. Une activité ReceiveActivity a déjà été définie comme activité enfant de WaitToStartService.
Sélectionnez receiveActivity1 et, dans le volet Propriétés, sous ServiceOperationInfo, cliquez sur les points de suspension pour ouvrir la boîte de dialogue Choisir une opération.
Sélectionnez StartupService, puis cliquez sur OK.
Dans le volet Propriétés, sous CanCreateInstance, sélectionnez True dans le menu déroulant. Cela signifie qu'une instance du workflow sera créée lorsque l'opération StartupService est appelée. La valeur par défaut de cette propriété est False, et si un ID de contexte n'a pas déjà été établi entre le client et le service au moment de l'appel de l'opération, le client reçoit le message suivant :
There is no context attached to incoming message for the service and the current operation is not marked with "CanCreateInstance = true". In order to communicate with this service check whether the incoming binding supports the context protocol and has a valid context initialized.
En mode Design Workflow1InitialState, sélectionnez setStateActivity1.
Dans le volet Propriétés, modifiez le nom de la propriété TargetStateName de stateActivity1 en OperationsState.
Naviguez pour revenir à la vue du concepteur de workflow principale. Une connexion entre Workflow1InitialState et OperationsState devrait maintenant exister.
Faites glisser cinq activités EventDrivenActivity dans l'activité d'OperationsState StateActivity et nommez-les WaitToAdd, WaitToSubtract, WaitToMultiply, WaitToDivide et WaitToEndService.
Double-cliquez sur WaitToAdd pour la développer.
Faites glisser une activité ReceiveActivity dans WaitToAdd.
Dans le volet Propriétés, sous ServiceOperationInfo, cliquez sur les points de suspension pour ouvrir la boîte de dialogue Choisir une opération.
Sélectionnez Ajouter, puis cliquez sur OK.
Faites glisser une activité CodeActivity dans l'activité ReceiveActivity.
Dans le volet Propriétés, cliquez sur le bouton Événements.
Double-cliquez dans la zone de texte pour que l'événement ExecuteCode génère automatiquement une méthode de gestionnaire d'événements pour l'événement ExecuteCode.
Ouvrez Workflow1.cs (ou Workflow1.vb si vous avez créé une solution Visual Basic), renommez la classe ServerWorkflow et modifiez les déclarations de variable pour returnValue et inputValue, qui ont été créées par le modèle, comme suit :
Public class ServerWorkflow Inherits StateMachineWorkflowActivity Public returnValue As Int32 Public inputValue As Int32 Private Sub codeActivity1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub End Class
public sealed partial class ServerWorkflow : StateMachineWorkflowActivity { public ServerWorkflow() { InitializeComponent(); } public int returnValue = default(int);public int inputValue = default(int); private void codeActivity1_ExecuteCode(object sender, EventArgs e) { } }
Naviguez jusqu'au gestionnaire d'événements pour ExecuteCode.
Dans le corps du gestionnaire d'événements, assignez la valeur suivante à returnValue :
Private Sub codeActivity1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) returnValue += inputValue End Sub
private void codeActivity1_ExecuteCode(object sender, EventArgs e) { returnValue += inputValue; }
Retournez dans la vue du concepteur OperationsState, cliquez sur l'activité ReceiveActivity Add, puis, dans le volet Propriétés, liez les paramètres n1 et (ReturnValue) à inputValue et returnValue, respectivement en mettant en surbrillance l'un des paramètres et en cliquant sur les points de suspension. Cette action ouvre la boîte de dialogue de liaison de propriété dans laquelle vous pouvez sélectionner la propriété de membre appropriée à laquelle lier un paramètre.
En outre, dans le volet Propriétés, laissez à CanCreateInstance la valeur False pour continuer à utiliser cette même instance de workflow créée dans l'étape 8. Sinon, l'affectation à CanCreateInstance de la valeur True créera une instance de workflow pour chaque appel d'opération.
Ajoutez les activités ReceiveActivity et CodeActivity à chaque activité EventDrivenActivity restante commençant par WaitToSubtract. Souvenez-vous également de lier les paramètres d'opération aux variables globales inputValue et returnValue.
Lorsque vous avez fini, chaque opération de mathématique doit avoir une ReceiveActivity associée et tous les gestionnaires d'événements d'activité CodeActivity doivent être implémentés de la manière suivante :
Private Sub codeActivity1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) returnValue += inputValue End Sub Private Sub codeActivity2_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) returnValue -= inputValue End Sub Private Sub codeActivity3_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) returnValue *= inputValue End Sub Private Sub codeActivity4_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) returnValue /= inputValue End Sub
private void codeActivity1_ExecuteCode(object sender, EventArgs e) { returnValue += inputValue; } private void codeActivity2_ExecuteCode(object sender, EventArgs e) { returnValue -= inputValue; } private void codeActivity3_ExecuteCode(object sender, EventArgs e) { returnValue *= inputValue; } private void codeActivity4_ExecuteCode(object sender, EventArgs e) { returnValue /= inputValue; }
Pour l'activité WaitToEndService EventDrivenActivity, faites glisser une activité ReceiveActivity dans WaitToEndService.
Dans le volet Propriétés, sous ServiceOperationInfo, cliquez sur les points de suspension pour ouvrir la boîte de dialogue Choisir une opération.
Sélectionnez ShutdownService, puis cliquez sur OK.
En mode Design OperationsState, faites glisser une activité SetStateActivity dans WaitToEndService au-dessous de l'activité ReceiveActivity.
Sélectionnez l'activité SetStateActivity et dans le volet Propriétés, sous TargetStateName, sélectionnez FinalState dans la liste déroulante.
Pour rendre le service de workflow persistant
Ouvrez le fichier App.config.
Ajoutez une référence à SqlWorkflowPersistenceService dans l'élément de comportement comme suit.
<behavior name="WorkflowServiceTutorial.ServerWorkflowBehavior" > <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> <serviceCredentials> <windowsAuthentication allowAnonymousLogons="false" includeWindowsGroups="true" /> </serviceCredentials> <workflowRuntime name="WorkflowServiceHostRuntime" validateOnCreate="true" enablePerformanceCounters="true"> <services> <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="Data Source=localhost\sqlexpress;Initial Catalog=NetFx35Samples_ServiceWorkflowStore;Integrated Security=True;Pooling=False" LoadIntervalSeconds="1" UnLoadOnIdle= "true" /> </services> </workflowRuntime> </behavior>
Le SqlWorkflowPersistenceService utilisé dans ce didacticiel correspond au type de service de persistance qui peut être utilisé dans les scénarios de flux de travail uniquement. Ainsi, les informations d'état du service de flux de travail sont rendues persistantes dans une base de données SQL à chaque fois que l'instance de flux de travail est inactive. Ce scénario est pris en charge par défaut dans .NET Framework version 3.5, mais vous pouvez dériver de la classe WorkflowPersistenceService pour rendre des données persistantes dans d'autres magasins de bases de données.
En outre, étant donné que le service de flux de travail peut utiliser la fonctionnalité de persistance de Windows Workflow Foundation, les informations d'état du service de flux de travail peuvent être rendues persistantes pendant l'exécution de l'implémentation d'une opération, plutôt qu'après son exécution, comme dans un service fiable.
La valeur de l'attribut connectionString dans PersistenceProviderElement correspond à « WorkflowServiceStore ». C'est le nom de la chaîne de connexion qui sera utilisée lors de la tentative de connexion à la base de données SQL.
Remarque : Ce didacticiel utilise la base de données NetFx35Samples_ServicesWorkflowStore. Pour créer la base de données, exécutez le script Createstores.cmd depuis One-Time Setup Procedure for the Windows Communication Foundation Samples. Générez le service et exécutez-le. WcfSvcHost.exe commencera à s'exécuter et hébergera le service. WcfSvcHost.exe est un outil de développement qui héberge des services à des fins de test. Dans ce but, les modèles Bibliothèque du service de workflow séquentiel et Bibliothèque du service de workflow de l'ordinateur d'état utilisent automatiquement l'application WcfSvcHost.exe pour héberger le service de workflow de telle sorte que vous n'avez pas à créer d'application hôte vous-même.
Commentaires
Une fois le service de workflow créé, Tâche 2 : créer un client de service de workflow décrit comment créer un client de service de workflow qui sera en mesure d'interagir avec ce service de workflow.
Voir aussi
Tâches
Tâche 2 : créer un client de service de workflow
Concepts
Comment : configurer un service de workflow
Autres ressources
Exercice 1 : créer un service de workflow de base
Copyright © 2007 par Microsoft Corporation. Tous droits réservés.