Partager via


Annexe A : développement de l'application de commande

Cette annexe contient des procédures détaillées à l'adresse des développeurs pour la création du service de commande de Contoso. L'objectif de cette annexe est de familiariser les développeurs avec la création d'applications incluant des services Windows Communication Foundation (WCF) ou Windows Workflow Foundation (WF) à l'aide de Visual Studio 1010 et de .NET Framework 4. La portion principale du didacticiel utilise cette application pour montrer aux administrateurs système ou aux propriétaires d'applications comment utiliser Windows Server AppFabric pour déployer, surveiller et dépanner des applications incluant des services WCF ou WF.

Le service de commande de Contoso comprend les quatre applications suivantes :

  • OrderProcessService (service de traitement des commandes) : service WCF qui simule l'appel d'une application de traitement de commande existante via des interfaces du service Web.

  • ShippingService (service d'expédition) : service WCF qui simule l'appel d'une application d'expédition existante via des API.

  • OrderWorkflowService (service de flux de travail de commande) : service de flux de travail WF qui gère le processus de commande, notamment sa réception, son traitement et son expédition.

  • OrderClient (client de commande) : application Windows Form qui fait office d'élément frontal pour le service de commande.

Notes

Cette annexe ne nécessite pas l'installation de Windows Server AppFabric. En revanche, vous devez commencer par installer les fichiers du Didacticiel utilisant l'interface de Windows Server AppFabric pour créer la structure de fichiers appropriée pour que l'annexe soit créée correctement. Notez que vous n'êtes pas obligé de commencer par suivre le Didacticiel utilisant l'interface de Windows Server AppFabric pour l'annexe ; installez simplement les fichiers. Pour la procédure d'installation du Didacticiel utilisant l'interface de Windows Server AppFabric, consultez le Leçon 1 : mise en route. Le dossier C:\DublinTutorial\OrderServiceSolution\Completed contient une copie de la solution achevée.

Procédure

La création de l'application implique les étapes suivantes :

  1. Développement du service WCF de traitement de commande

  2. Développement du service WCF d'expédition

  3. Développement du service WCF de flux de travail de commande

  4. Achèvement du service WCF de traitement de commande

  5. Achèvement du service WCF d'expédition

  6. Développement de l'application cliente de commande

  7. Empaquetage du service de commande

Développement du service WCF de traitement de commande

L'application de traitement de commande a été achetée par Contoso. Elle inclut des services Web avec lesquels d'autres applications peuvent communiquer. En tant que développeur Contoso, vous devez créer un service WCF nommé OrderProcessingService pour interagir avec l'application de traitement de commande.

Pour créer une solution Visual Studio et une application de service WCF pour OrderProcessingService

  1. Cliquez sur Démarrer, pointez sur Tous les programmes, puis sur Microsoft Visual Studio 2010, puis cliquez sur Microsoft Visual Studio 2010.

  2. Dans le menu Fichier, cliquez sur Nouveau, puis sur Nouveau projet.

  3. Dans Nouveau projet, choisissez ou tapez les valeurs suivantes, puis cliquez sur OK.

    Propriété Valeur

    Types de projets

    Visual C#/Web

    Modèles

    Application de service WCF

    Nom

    OrderProcessingService

    Emplacement

    C:\DublinTutorial\OrderServiceSolution

    Nom de solution

    OrderService

    Créer un répertoire pour la solution

    (sélectionné)

  4. Dans Explorateur de solutions, développez OrderProcessingService, cliquez avec le bouton droit sur IService1.cs, puis cliquez sur Supprimer.

  5. Cliquez sur OK pour confirmer la suppression définitive du fichier.

  6. Dans Explorateur de solutions, développez OrderProcessingService, cliquez avec le bouton droit sur Service1.svc, puis cliquez sur Supprimer.

  7. Cliquez sur OK pour confirmer la suppression définitive du fichier.

La première tâche de création d'un service WCF consiste à définir un contrat. Ce dernier spécifie les opérations que le service prend en charge. Une opération peut être considérée comme une méthode de service Web. Dans l'interface, chaque méthode correspond à une opération de service spécifique. Dans OrderProcessingService, vous définissez deux méthodes, ProcessOrder et CancelOrderProcess.

Pour définir le contrat de service et le contrat de données pour le service de traitement de commande

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderProcessService, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  2. Dans Ajouter un nouvel élément - OrderProcessService, choisissez ou tapez les valeurs suivantes, puis cliquez sur Ajouter.

    Propriété Valeur

    Catégories

    Visual C#/Web

    Modèle

    Service WCF

    Nom

    OrderProcessing.svc

    Deux fichiers sont ajoutés à la solution : IOrderProcessing.cs et OrderProcessing.svc.

  3. Dans Explorateur de solutions, double-cliquez sur IOrderProcessing.cs pour l'ouvrir.

  4. Cliquez avec le bouton droit sur l'espace de noms OrderProcessingService, cliquez sur Refactoriser, puis sur Renommer pour ouvrir la boîte de dialogue Renommer.

  5. Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService, puis cliquez sur OK.

  6. Cliquez sur Appliquer, puis sur Oui.

  7. Modifiez le code source d'OrderProcessing.svc comme suit :

    using System; 
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService
    {
        [ServiceContract]
        public interface IOrderProcessing
        {
            [OperationContract]
            string ProcessOrder(PurchaseOrder po);
    
            [OperationContract]
            string CancelOrderProcess(string orderID);
        }
    
        [DataContract]
        public class PurchaseOrder
        {
            [DataMember]
            public string POID;
            [DataMember]
            public string FirstName;
            [DataMember]
            public string LastName;
            [DataMember]
            public string EmailAddress;
            [DataMember]
            public string TelephoneNumber;
            [DataMember]
            public string AddressLine1;
            [DataMember]
            public string AddressLine2;
            [DataMember]
            public string City;
            [DataMember]
            public string State;
            [DataMember]
            public string ZipCode;
            [DataMember]
            public string Description;
            [DataMember]
            public int Quantity;
            [DataMember]
            public string UnitPrice;
        }
    }
    

    Dans ce fichier, vous définissez les contrats de données et de service. Les clients peuvent appeler le service pour traiter une commande et annuler le traitement de commande.

Après avoir créé les contrats qui sont définis à l'aide d'une interface, il convient d'implémenter l'interface. Cela implique la création d'une classe nommée OrderProcessService qui implémente l'interface IOrderProcessing définie par l'utilisateur.

Pour implémenter le contrat de service de traitement de commande

  1. Dans Explorateur de solutions, double-cliquez sur IOrderProcessing.cs pour l'ouvrir.

  2. Modifiez le code source comme suit :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    using System.Threading;
    using System.IO;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService
    {
        class WorkItem
        {
            private Thread workThread;
            private object workItemLock;
            private bool completeFlag;
    
            public Thread WorkThread { get { return workThread; } set { workThread = value; } }
            public object WorkItemLock { get { return workItemLock; } }
            public bool CompleteFlag { get { return completeFlag; } }
    
            public WorkItem(Thread WorkThread)
            {
                workThread = WorkThread;
                workItemLock = new object();
                completeFlag = false;
            }
    
            public void Complete()
            {
                completeFlag = true;
            }
        }
    
        public class OrderProcessing : IOrderProcessing
        {
            private static Dictionary<String, WorkItem> WorkItemMap = new Dictionary<String, WorkItem>();
    
            public string ProcessOrder(PurchaseOrder po)
            {
                //run the code from a different thread to simulate asynchronized call
                ThreadPool.QueueUserWorkItem(SendProcessResult, po);
                return ("The request for processing order[" + po.POID + "] has been received.");
            }
    
            private void SendProcessResult(object state)
            {
                PurchaseOrder po = (PurchaseOrder)state;
    
                WorkItem workItem = new WorkItem(Thread.CurrentThread);
                WorkItemMap.Add(po.POID, workItem);
    
                //Simulating the order processing process
                Thread.Sleep(120000);
    
                //The following code will be uncommented later in the process
                //OrderWorkflowService.ProcessServiceResult reply = new OrderWorkflowService.ProcessServiceResult();
                //reply.POID = po.POID;
                //reply.Message = "The order has been processed successfully.";
    
                //lock (workItem.WorkItemLock)
                //{
                //    using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
                //    {
                //        client.SubmitProcessResult(reply);
                //    }
    
                //    workItem.Complete();
                //    WorkItemMap.Remove(po.POID);
                //}
    
            }
    
            public string CancelOrderProcess(string poID)
            {
                string ret = "Cancel unavailable for this order.";
    
                //=====================================================//
                //===[ Attempt to get a work item for the order Id 
                //=====================================================//
                WorkItem workItem;
                if (WorkItemMap.TryGetValue(poID, out workItem) == true)
                {
                    //===========================================================
                    //=== Slight race condition here. Workitem could complete
                    //=== before we aquire its lock. So we check the          
                    //=== completion flag inside the lock.                    
                    //===========================================================
                    lock (workItem.WorkItemLock)
                    {
                        if ((!workItem.CompleteFlag) && (workItem.WorkThread.IsAlive))
                        {
                            workItem.WorkThread.Abort();
                            WorkItemMap.Remove(poID);
                            ret = "The order process has been terminated successfully.";
                        }
                    }
                }
                return ret;
            }
        }
    }
    

L'utilisation d'un fichier de configuration permet de fournir des données de point de terminaison et de comportement de service au point de déploiement plutôt qu'au moment de la conception. Dans ce fichier de configuration, vous définissez deux points de terminaison.

Pour configurer le service de traitement de commande à l'aide d'un fichier de configuration

  1. Dans Explorateur de solutions, développez OrderProcessingService, puis double-cliquez sur Web.config pour l'ouvrir. Insérez une balise <services> dans la balise <system.serviceModel> :

        <services>
          <service name="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.OrderProcessing">
            <endpoint address="" binding="basicHttpBinding" contract="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.IOrderProcessing" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
    

Pour compiler le service WCF de traitement de commande

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderProcessingService, puis cliquez sur Reconstruire. Dans la fenêtre de sortie, vérifiez que la compilation du projet a réussi.

Pour tester le service WCF de traitement de commande

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderProcessingService, puis cliquez sur Afficher dans le navigateur. Une fenêtre Internet Explorer s'ouvre, répertoriant les fichiers du répertoire.

  2. Dans celle-ci, cliquez sur OrderProcessing.svc. Assurez-vous que vous n'obtenez aucune erreur.

Développement du service WCF d'expédition

Le service d'expédition est un service WCF appelant un magasin SQL Server. Dans la simulation, vous n'effectuez pas réellement d'appel de base de données.

Pour ajouter un nouveau projet d'application de service WCF à la solution

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur Solution ‘OrderService’, pointez sur Ajouter, puis cliquez sur Nouveau projet.

  2. Dans Ajouter un nouveau projet, choisissez ou tapez les valeurs suivantes, puis cliquez sur OK.

    Propriété Valeur

    Types de projets

    Visual C#/Web

    Modèles

    Application de service WCF

    Nom

    ShippingService

    Emplacement

    C:\DublinTutorial\OrderServiceSolution\OrderService

  3. Dans Explorateur de solutions, développez ShippingService, cliquez avec le bouton droit sur IService1.cs, puis cliquez sur Supprimer.

  4. Cliquez sur OK pour confirmer la suppression définitive du fichier.

  5. Dans Explorateur de solutions, développez ShippingService, cliquez avec le bouton droit sur Service1.svc, puis cliquez sur Supprimer.

  6. Cliquez sur OK pour confirmer la suppression définitive du fichier.

Vous définissez un contrat de service nommé IShipping qui contient deux contrats d'opération, ShipOrder et CancelShipping.

Pour définir le contrat de service WCF d'expédition

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur ShippingService, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  2. Dans Ajouter un nouvel élément - ShippingService, choisissez ou tapez les valeurs suivantes, puis cliquez sur Ajouter.

    Propriété Valeur

    Catégories

    Visual C#/Web

    Modèle

    Service WCF

    Nom

    Shipping.svc

    Deux fichiers sont ajoutés au projet, IShipping.cs et Shipping.svc.

  3. Dans Explorateur de solutions, double-cliquez sur IShipping.cs pour l'ouvrir.

  4. Cliquez avec le bouton droit sur l'espace de noms ShippingService, cliquez sur Refactoriser, puis sur Renommer pour ouvrir la boîte de dialogue Renommer.

  5. Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService, puis cliquez sur OK.

  6. Cliquez sur Appliquer, puis sur Oui.

  7. Modifiez le code source comme suit :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService
    {
        [ServiceContract]
        public interface IShipping
        {
            [OperationContract]
            string ShipOrder(string poID);
    
            [OperationContract]
            string CancelShipping(string poID);
        }
    }
    

Pour implémenter le contrat de service WCF d'expédition

  1. Dans Explorateur de solutions, double-cliquez sur Shipping.svc pour l'ouvrir.

  2. Modifiez le code source comme suit :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    using System.Threading;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService
    {
        class WorkItem
        {
            private Thread workThread;
            private object workItemLock;
            private bool completeFlag;
    
            public Thread WorkThread { get { return workThread; } set { workThread = value; } }
            public object WorkItemLock { get { return workItemLock; } }
            public bool CompleteFlag { get { return completeFlag; } }
    
            public WorkItem(Thread WorkThread)
            {
                workThread = WorkThread;
                workItemLock = new object();
                completeFlag = false;
            }
    
            public void Complete()
            {
                completeFlag = true;
            }
        }
    
        public class Shipping : IShipping
        {
            private static Dictionary<String, WorkItem> WorkItemMap = new Dictionary<String, WorkItem>();
    
            public string ShipOrder(string poID)
            {
                //run the code from a different thread to simulate asynchronized call
                ThreadPool.QueueUserWorkItem(SendShippingResult, poID);
                return ("The request for processing order[" + poID + "] has been received.");
            }
    
            private void SendShippingResult(object state)
            {
                string poID = state.ToString();
    
                WorkItem workItem = new WorkItem(Thread.CurrentThread);
                WorkItemMap.Add(poID, workItem);
    
                //Simulating the order processing process
                Thread.Sleep(60000);
    
                //The following portion will be uncommented after referencing OrderWorkflowService
                //OrderWorkflowService.ShippingServiceResult reply = new OrderWorkflowService.ShippingServiceResult();
                //reply.POID = poID;
                //reply.Message = "The order has been shipped.";
    
                //lock (workItem.WorkItemLock)
                //{
                //    using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
                //    {
                //        client.SubmitShippingResult(reply);
                //    }
    
                //    workItem.Complete();
                //    WorkItemMap.Remove(poID);
                //}
            }
    
            public string CancelShipping(string poID)
            {
                string ret = "Cancel unavailable for this order.";
    
                //=====================================================//
                //===[ Attempt to get a work item for the order Id 
                //=====================================================//
                WorkItem workItem;
                if (WorkItemMap.TryGetValue(poID, out workItem) == true)
                {
                    //===========================================================
                    //=== Slight race condition here. Workitem could complete
                    //=== before we aquire its lock. So we check the          
                    //=== completion flag inside the lock.                    
                    //===========================================================
                    lock (workItem.WorkItemLock)
                    {
                        if ((!workItem.CompleteFlag) && (workItem.WorkThread.IsAlive))
                        {
                            workItem.WorkThread.Abort();
                            WorkItemMap.Remove(poID);
                            ret = "The shipping process has been terminated successfully.";
                        }
                    }
                }
                return ret;
            }
        }
    }
    

Dans ce fichier de configuration, vous définissez deux points de terminaison.

Pour configurer le service WCF d'expédition à l'aide d'un fichier de configuration

  1. Dans Explorateur de solutions, développez ShippingService, puis double-cliquez sur Web.config pour l'ouvrir. Insérez une balise <services> dans la balise <system.serviceModel> :

        <services>
          <service name="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Shipping">
            <endpoint address="" binding="basicHttpBinding" contract="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.IShipping" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
    

Pour compiler le service WCF d'expédition

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet ShippingService, puis cliquez sur Reconstruire. Dans la fenêtre de sortie, vérifiez que la compilation du projet a réussi.

Développement du service WCF de flux de travail de commande

L'application de service de flux de travail de commande est la portion majeure de l'ensemble du service. Elle orchestre l'ensemble du processus d'entreprise. Elle reçoit un bon de commande, appelle OrderProcessingService et ShippingService, puis envoie un message électronique au client concernant l'état du bon de commande.

Pour ajouter un nouveau projet d'application de service de flux de travail WCF à la solution

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur Solution ‘OrderService’, pointez sur Ajouter, puis cliquez sur Nouveau projet.

  2. Dans Ajouter un nouveau projet, choisissez ou tapez les valeurs suivantes, puis cliquez sur OK.

    Propriété Valeur

    Types de projets

    Visual C#/Workflow

    Modèles

    Application de service de flux de travail WCF

    Nom

    OrderWorkflowService

    Emplacement

    C:\DublinTutorial\OrderServiceSolution\OrderService

OrderWorkflowService utilise OrderProcessingService et ShippingService. Vous devez référencer les deux services.

Pour ajouter les références de services

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderWorkflowService, puis cliquez sur Ajouter une référence de service.

  2. Dans Ajouter une référence de service, cliquez sur Découvrir. Visual Studio doit découvrir les deux services.

  3. Entrez et sélectionnez les valeurs suivantes, puis cliquez sur OK pour créer le service.

    Propriété Valeur

    Services

    OrderProcessing.svc

    Espace de noms

    OrderProcessService

  4. Répétez les étapes d'ajout d'une autre référence de service avec les valeurs suivantes :

    Propriété Valeur

    Services

    Expédition

    Espace de noms

    ShippingService

Vous devez définir une activité de flux de travail personnalisée à utiliser pour simuler l'envoi de notifications par courrier électronique.

Pour créer une activité de code de flux de travail

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderWorkflowService, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  2. Dans Ajouter un nouvel élément - OrderWorkflowService, choisissez ou tapez les valeurs suivantes, puis cliquez sur Ajouter.

    Propriété Valeur

    Catégories

    Visual C#/Workflow

    Modèle

    Activité de code

    Nom

    SendNotification.cs

  3. Dans Explorateur de solutions, double-cliquez sur SendNotification.cs pour l'ouvrir.

  4. Cliquez avec le bouton droit sur l'espace de noms OrderWorkflowService, cliquez sur Refactoriser, puis sur Renommer pour ouvrir la boîte de dialogue Renommer.

  5. Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService, puis cliquez sur OK.

  6. Cliquez sur Appliquer, puis sur Oui.

  7. Modifiez le code source comme suit :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Activities;
    using System.IO;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
    {
        public class SendNotification : CodeActivity
        {
            InArgument<string> to;
            InArgument<string> subject;
            InArgument<string> body;
            string pathRoot = @"C:\DublinTutorial\Inbox\";
    
            public InArgument<string> To { get { return this.to; } set { this.to = value; } }
            public InArgument<string> Subject { get { return this.subject; } set { this.subject = value; } }
            public InArgument<string> Body { get { return this.body; } set { this.body = value; } }
            public SendNotification() { }
    
            public SendNotification(InArgument<string> To, InArgument<string> Subject, InArgument<string> Body)
            {
                this.to = To; this.subject = Subject; this.body = Body;
            }
    
            protected override void Execute(CodeActivityContext context)
            {
                string filename;
                string content;
    
                try
                {
                    filename = this.to.Get<String>(context) + "~~" + this.subject.Get<string>(context) + "_" + DateTime.Now.ToFileTime() + ".txt";
                    content = String.Format("To: {0}" + Environment.NewLine
                        + "From: {1}" + Environment.NewLine
                        + "Subject: {2}" + Environment.NewLine
                        + Environment.NewLine
                        + "{3}",
                        this.to.Get<String>(context), "CustomerRelations@Contoso.com", this.subject.Get<String>(context), this.body.Get<String>(context));
    
                    File.WriteAllText((pathRoot + filename), content);
                }
                catch (Exception Ex)
                {
                    context.SetValue(Body, Ex.Message);
                }
    
            }
        }
    }
    

    Vous pouvez observer que le chemin d'accès « C:\DublinTutorial\Inbox\ » est codé en dur.

Dans la procédure suivante, vous définissez les types de données. Ces derniers sont utilisés par OrderProcessingService et ShippingService pour renvoyer des résultats à OrderWorkflowService.

Pour définir des types de données

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderWorkflowService, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  2. Dans Ajouter un nouvel élément - OrderWorkflowService, choisissez ou tapez les valeurs suivantes, puis cliquez sur Ajouter.

    Propriété Valeur

    Catégories

    Visual C#/Code

    Modèle

    Fichier de code

    Nom

    DataTypes.cs

  3. Dans Explorateur de solutions, double-cliquez sur DataTypes.cs pour l'ouvrir.

  4. Modifiez le code source comme suit :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
    {
        [DataContract]
        public class ProcessServiceResult
        {
            [DataMember]
            public string POID;
            [DataMember]
            public string Message;
        }
    
        [DataContract]
        public class ShippingServiceResult
        {
            [DataMember]
            public string POID;
            [DataMember]
            public string Message;
        }
    }
    
  5. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderWorkflowService, puis cliquez sur Reconstruire. Vous devez créer le projet de façon à ce que l'activité de code soit accessible à partir du flux de travail que vous développerez à l'étape suivante. La compilation peut également exposer les points de terminaison de service WCF référencés au flux de travail.

L'étape suivante consiste à définir le flux de travail. Ce dernier contient plusieurs états. Vous définissez d'abord les états, puis leurs détails. Chaque partie du développement peut contenir les étapes suivantes :

  1. composer le flux de travail à l'aide d'activités ;

  2. définir des variables ;

  3. configurer les activités.

Pour définir le flux de travail

  1. Dans Explorateur de solutions, développez OrderWorkflowService, cliquez avec le bouton droit sur Service1.xamlx, puis cliquez sur Renommer. Renommez le fichier en OrderWorkflow.xamlx.

  2. Dans Explorateur de solutions, double-cliquez sur OrderWorkflow.xamlx pour l'ouvrir. Deux activités sont répertoriées dans Sequential Service : l'une est nommée ReceiveRequest et l'autre SendResponse.

  3. Cliquez avec le bouton droit sur l'activité Sequential Service, puis cliquez sur Supprimer.

  4. Dans le flux de travail, cliquez sur Drop activity here, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    configurationName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderWorkflow

    Nom

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderWorkflow

  5. Dans la partie gauche de la fenêtre, cliquez sur Boîte à outils pour ouvrir le panneau Boîte à outils, puis épinglez-le du côté gauche de la fenêtre.

  6. Faites glisser les activités suivantes de la Boîte à outils vers le flux de travail, là où figure la mention « Drop activity here ».

    Catégorie Activité Remarque

    Organigramme

    Flowchart

    L'activité Flowchart est une activité composite contenant un Début par défaut. Dans les étapes suivantes, vous allez y ajouter d'autres activités :

  7. Faites glisser les activités suivantes de la Boîte à outils vers le flux de travail dans l'ordre indiqué :

    Catégorie Activité Remarque

    Messagerie

    ReceiveAndSendReply

    Ceci est l'état « Attente de la commande ».

    Flux de contrôle

    Sequence

    Ceci contiendra de deuxième état « Commande ouverte ».

    Flowchart

    FlowDecision

    L'activité FlowDecision contribue à la transition entre états.

    Flux de contrôle

    Sequence

    Ceci contiendra le troisième état « Commande traitée ».

    Flowchart

    FlowDecision

    L'activité FlowDecision contribue à la transition entre états.

    Flux de contrôle

    Sequence

    Ceci contiendra le dernier état « Commande exécutée ».

  8. Utilisez le pointeur de la souris pour connecter les activités de façon à ce qu'elles ressemblent à ceci :

    67e7c9dd-77e7-43be-ad5a-797b3b46f6e8

  9. Au bas du flux de travail, cliquez sur Variables pour ouvrir le panneau Variables.

  10. Dans le panneau Variables, cliquez sur Créer une variable, puis créez les variables suivantes :

    Nom de la variable Type de variable Étendue Remarque

    poID

    String

    Flowchart

    poID est un numéro de GUID. poID est également utilisé pour corrélation.

    isProcessed

    Boolean

    Flowchart

    Il s'agit d'une balise indiquant si une commande a été traitée avec succès.

    isShipped

    Boolean

    Flowchart

    Il s'agit d'une balise indiquant si une commande a été expédiée.

    isUpdated

    Boolean

    Flowchart

    Il s'agit d'une balise indiquant si une commande a été mise à jour par le client.

    po

    PurchaseOrder

    Flowchart

    Il s'agit d'un type de données personnalisé défini dans OrderProcessingService. Il contient des informations de bon de commande.

    poUpdate

    PurchaseOrder

    Flowchart

    Ceci contient les informations mises à jour quand un client veut mettre à jour le bon de commande.

    correlationorderWorkflow

    CorrelationHandle

    Flowchart

    Ceci est le handle de corrélation utilisé pour le client se connectant au service et le service se connectant à OrderProcessService et ShippingService.

    Voici une capture d'écran des variables créées :

    9208977f-710c-460f-afd8-5c6bd8a792d9

  11. Dans le flux de travail, cliquez sur l'activité Flowchart, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Service de commande

  12. Dans le flux de travail, cliquez sur la première activité Sequence, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Attente de la commande

  13. Dans le flux de travail, cliquez sur la deuxième activité Sequence, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Commande ouverte

  14. Dans le flux de travail, cliquez sur la troisième activité Sequence, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Commande traitée

  15. Dans le flux de travail, cliquez sur la quatrième activité Sequence, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Commande exécutée

  16. Dans le flux de travail, cliquez sur la première activité FlowDecision, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Condition

    isProcessed

    FalseLabel

    Mise à jour

    TrueLabel

    Processed

  17. Dans le flux de travail, cliquez sur la deuxième activité FlowDecision, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Condition

    isShipped

    FalseLabel

    Updated

    TrueLabel

    Shipped

    Vous avez défini la structure principale du flux de travail de la machine à états. Vous allez à présent définir les états.

  18. Dans le flux de travail, double-cliquez sur Attente de la commande. Vous pouvez observer que le chemin d'accès figure sous l'onglet. Vous pouvez cliquer sur Service de commande pour revenir à la page présentant le flux complet de la machine à états.

  19. Faites glisser les activités suivantes de la Boîte à outils vers le flux de travail dans l'ordre indiqué :

    Catégorie Activité Remarque

    Primitives

    Assign

    Cette activité Assign obtient un ID de commande (GUID) pour la commande.

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowSerivce

    SendNotification

    Cette activité personnalisée envoie une notification par courrier électronique au client.

    Primitives

    Assign

    Cette activité Assign est utilisée pour permettre la surveillance du produit du bon de commande.

    Primitives

    Assign

    Cette activité Assign est utilisée pour permettre la surveillance de la quantité du bon de commande.

  20. Réorganisez les activités pour qu'elles ressemblent à ceci :

    Attendre les activités d'état de commande

  21. Au bas du flux de travail, cliquez sur Variables pour ouvrir le panneau Variables.

  22. Dans le panneau Variables, cliquez sur Créer une variable, puis créez les variables suivantes :

    Nom de la variable Type de variable Étendue Remarque

    produit

    String

    Attente de la commande

    AppFabric est capable de suivre des variables de flux de travail. Cette variable est créée pour permettre le suivi du nom de produit.

    quantité

    Int32

    Attente de la commande

    Cette variable est destinée au suivi.

  23. Dans le flux de travail, cliquez sur l'activité Receive, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data: po; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.Purchaseorder

    DisplayName

    Recevoir bon de commande

    OperationName

    SubmitPO

    SerivceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (sélectionné)

  24. Dans le flux de travail, cliquez sur la première activité Assign, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Attribuer ID de bon de commande

    Pour

    po.POID

    Valeur

    System.Guid.NewGuid().ToString()

  25. Dans le flux de travail, cliquez sur l'activité SendReplyToReceive, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data: po.POID; Message type: string

    CorrelationInitializers

    CorrelationOrderWorkflow;Query correlation initialize; key1=sm:body()/xg0:string

    237be300-a94d-4b8e-a707-83f4d2041f6e

    Notes

    Vous venez d'effectuer ce qu'on appelle une corrélation. Ce flux de travail comprend sept activités de réception : une réception du bon de commande, une réception du résultat du service de traitement, une réception du résultat du service d'expédition, deux réceptions de mises à jour du client et deux réceptions d'annulations du client. Après réception du bon de commande, le service de flux de travail génère un numéro de GUID faisant office de numéro de commande. Imaginons que le service de flux de travail reçoive un grand nombre de bons de commande en même temps. Le moteur de flux de travail crée une instance de flux de travail pour chaque demande de bon de commande. Le moteur de flux de travail doit mettre en correspondance (corréler) les six autres demandes avec les instances de flux de travail. Pour ce faire, il a besoin d'un identifiant unique pour chaque corrélation. Dans cet exemple, cet identifiant est le numéro de commande (GUID). Dans la première activité SendReplyToReceive, vous définissez un CorrelationInitializer. Vous choisissez le type de requête de l'initialiseur de corrélation de requête, ce qui signifie que l'identifiant unique figure dans le message transmis à l'activité de réception. Vous pouvez également spécifier la valeur xPath du champ. Outre l'initialiseur de corrélation, vous devez spécifier un handle de corrélation dans le champ CorrelateWith. Un handle de corrélation est un conteneur pour les données de corrélation, qui permet de récupérer ces dernières partout dans le flux de travail. Dans les réceptions suivantes, vous spécifiez le même handle de corrélation. Et dans les champs CorrelateOn, vous spécifiez la manière d'extraire le numéro de commande du message reçu.

  26. Dans le flux de travail, cliquez sur l'activité SendNotification, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "We have received your order.  Your order number is " + po.POID

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Received"

    To

    po.EmailAddress

  27. Dans le flux de travail, cliquez sur la deuxième activité Assign, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Attribuer nom de produit

    To

    product

    Valeur

    po.Description

  28. Dans le flux de travail, cliquez sur la troisième activité Assign, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Attribuer quantité

    To

    quantité

    Valeur

    po.Quantity

    Vous avez fini d'implémenter l'état Attente de la commande.

  29. Sous le nom d'onglet, cliquez sur Service de commande pour afficher l'activité Flowchart « Service de commande ».

  30. Dans le flux de travail, double-cliquez sur l'activité Sequence Commande ouverte pour implémenter l'état

  31. Faites glisser les activités suivantes de la Boîte à outils vers le flux de travail dans l'ordre indiqué :

    Catégorie Activité Remarque

    Primitives

    Assign

    Flux de contrôle

    Parallel

  32. Faites glisser l'activité suivante dans l'activité Parallel :

    Catégorie Activité Remarque

    Flux de contrôle

    Sequence

  33. Faites glisser l'activité suivante dans l'activité Sequence :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Activities

    ProcessOrder

    Runtime

    Persist

    Messaging

    Receive

    Microsoft.Samples.Dublin.Tutorials.OrderService.orderWorkflowService

    SendNotification

    Primitives

    Assign

  34. Faites glisser l'activité suivante dans l'activité Parallel et à droite de l'activité Sequence existante :

    Catégorie Activité Remarque

    Messaging

    ReceiveAndSendReply

    L'activité ReceiveAndSendReply est une activité composite comportant une activité Sequence enveloppant une activité Receive et une activité SendReplyToReceive.

  35. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée et sous les activités Receive et SendReplyToReceive :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Activities

    CancelOrderProcess

    Flux de contrôle

    Si

  36. Faites glisser l'activité suivante dans la branche Then de l'activité If :

    Catégorie Activité Remarque

    Flux de contrôle

    Sequence

  37. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée :

    Catégorie Activité Remarque

    Primitives

    Assign

    Primitives

    Assign

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

  38. Faites glisser l'activité suivante dans la branche Else de l'activité If :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

  39. Faites glisser l'activité suivante dans la branche la plus à droite de l'activité Parallel :

    Catégorie Activité Remarque

    Messaging

    ReceiveAndSendReply

  40. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée et sous les activités Receive et SendReplyToReceive :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Activities

    CancelOrderProcess

    Flux de contrôle

    Si

  41. Faites glisser l'activité suivante dans la branche Then de l'activité If :

    Catégorie Activité Remarque

    Flux de contrôle

    Sequence

  42. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    Runtime

    TerminateWorkflow

  43. Faites glisser l'activité suivante dans la branche Else de l'activité If :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    Après l'ajout des activités, l'état Commande ouverte ressemble à ceci :

    État Commande ouverte

  44. Cliquez sur l'activité Sequence dans la branche la plus à gauche de l'activité Parallel, puis cliquez sur Variables au bas du flux de travail pour ouvrir le panneau Variables.

  45. Dans le panneau Variables, cliquez sur Créer une variable, puis créez les variables suivantes :

    Nom de la variable Type de variable Étendue Remarque

    cancelOrderProcessAcknowledgement

    String

    Parallel

    ProcessServiceResult

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ProcessServiceResult

    Sequence

    processServiceAcknowledgement

    String

    Sequence

  46. Dans le flux de travail, cliquez sur la première activité Assign dans le haut de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Initialiser isUpdated

    To

    isUpdated

    Valeur

    False

  47. Dans le flux de travail, cliquez sur l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Completion

    isUpdated Or isProcessed

    DisplayName

    Traiter commande

  48. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Traitement

  49. Dans le flux de travail, cliquez sur l'activité ProcessOrder dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Traiter commande

    po

    po

    ProcessOrderResult

    processServiceAcknowledgement

  50. Dans le flux de travail, cliquez sur l'activité Receive dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data:processServiceResult; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ProcessServiceResult

    DisplayName

    Recevoir résultat du traitement

    OperationName

    SubmitProcessResult

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (effacé)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:ProcessServiceResult/sg0:POID

    CorrelationWith

    correlationOrderWorkflow

  51. Dans le flux de travail, cliquez sur l'activité SendNotification dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Order with order#" + po.POID + " has been processed, and is ready for shipping."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Processed"

    To

    po.EmailAddress
  52. Dans le flux de travail, cliquez sur l'activité Assign dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Définir balise isProcessed

    To

    isProcessed

    Valeur

    True

    Vous avez fini de configurer la branche la plus à gauche de l'activité Parallel.

  53. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    En attente de mise à jour

  54. Dans le flux de travail, cliquez sur l'activité Receive dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data:poUpdate; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Recevoir mise à jour

    OperationName

    SubmitUpdate

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (effacé)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:PurchaseOrder/xg0:POID

    CorrelationWith

    correlationOrderWorkflow

  55. Dans le flux de travail, cliquez sur l'activité SendReplyToReceive dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data: “Mise à jour du bon de commande reçue”; Message type: String

    DisplayName

    Accuser réception de la mise à jour

  56. Dans le flux de travail, cliquez sur l'activité CancelOrderProcess dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Annuler traitement de commande

    orderID

    po.POID
  57. Dans le flux de travail, cliquez sur l'activité If dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Condition

    cancelOrderProcessAcknowledgement = "The order process has been terminated successfully."

    DisplayName

    Vérifier état d'annulation

  58. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Séquence de réussite d'annulation

  59. Dans le flux de travail, cliquez sur la première activité Assign dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Actualiser bon de commande

    To

    po

    Valeur

    poUpdate
  60. Dans le flux de travail, cliquez sur la deuxième activité Assign dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Définir balise isUpdated

    To

    isUpdated

    Valeur

    True
  61. Dans le flux de travail, cliquez sur l'activité SendNotification dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order has updated upon your request. The order is under processing."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Updated (by customer)"

    To

    po.EmailAddress
  62. Dans le flux de travail, cliquez sur l'activité SendNotification dans la branche Else de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order update request cannot be processed. Please try again."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Update (by customer) Failed"

    To

    po.EmailAddress

    Vous avez fini de configurer la branche médiane de l'activité Parallel.

  63. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Attente de l'annulation

  64. Dans le flux de travail, cliquez sur l'activité Receive dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data:poID; Message type:String

    DisplayName

    Recevoir annulation

    OperationName

    SubmitCancellation

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (effacé)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:string

    CorrelationWith

    correlationOrderWorkflow

  65. Dans le flux de travail, cliquez sur l'activité SendReplyToReceive dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data: “PO cancellation received”; Message type: String

    DisplayName

    Accuser réception de l'annulation

  66. Dans le flux de travail, cliquez sur l'activité CancelOrderProcess dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Annuler traitement de commande

    orderID

    po.POID
  67. Dans le flux de travail, cliquez sur l'activité If dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Condition

    cancelOrderProcessAcknowledgement = "The order process has been terminated successfully."

    DisplayName

    Vérifier état d'annulation

  68. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Séquence de réussite d'annulation

  69. Dans le flux de travail, cliquez sur l'activité SendNotification dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order has been cancelled upon your request."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Cancelled (by customer)"

    To

    po.EmailAddress
  70. Dans le flux de travail, cliquez sur l'activité TerminateWorkflow dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Arrêter flux de travail

    Reason

    “Client cancellation”
  71. Dans le flux de travail, cliquez sur la deuxième activité SendNotification dans la branche Else de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order cancellation request cannot be processed. Please try again."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Cancellation(by customer) Failed"

    To

    po.EmailAddress

    Vous avez fini de configurer la branche la plus à droite de l'activité Parallel.

  72. Sous le nom d'onglet, cliquez sur Service de commande pour afficher l'activité Flowchart « Order service ».

  73. Dans le flux de travail, double-cliquez sur l'activité Sequence Commande traitée pour implémenter l'état

  74. Faites glisser les activités suivantes de la Boîte à outils vers le flux de travail dans l'ordre indiqué :

    Catégorie Activité Remarque

    Primitives

    Assign

    Flux de contrôle

    Parallel

  75. Faites glisser l'activité suivante dans l'activité Parallel :

    Catégorie Activité Remarque

    Flux de contrôle

    Sequence

  76. Faites glisser l'activité suivante dans l'activité Sequence :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService.Activities

    ShipOrder

    Runtime

    Persist

    Messaging

    Receive

    Primitives

    Assign

  77. Faites glisser l'activité suivante dans l'activité Parallel et à droite de l'activité Sequence existante :

    Catégorie Activité Remarque

    Messaging

    ReceiveAndSendReply

    L'activité ReceiveAndSendReply est une activité composite comportant une activité Sequence enveloppant une activité Receive et une activité SendReplyToReceive.

  78. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée et sous les activités Receive et SendReplyToReceive :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService.Activities

    CancelShipping

    Flux de contrôle

    Si

  79. Faites glisser l'activité suivante dans la branche Then de l'activité If :

    Catégorie Activité Remarque

    Flux de contrôle

    Sequence

  80. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée :

    Catégorie Activité Remarque

    Primitives

    Assign

    Primitives

    Assign

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  81. Faites glisser l'activité suivante dans la branche Else de l'activité If :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  82. Faites glisser l'activité suivante dans la branche la plus à droite de l'activité Parallel :

    Catégorie Activité Remarque

    Messaging

    ReceiveAndSendReply

  83. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée et sous les activités Receive et SendReplyToReceive :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService.Activities

    CancelShipping

    Flux de contrôle

    Si

  84. Faites glisser l'activité suivante dans la branche Then de l'activité If :

    Catégorie Activité Remarque

    Flux de contrôle

    Sequence

  85. Faites glisser les activités suivantes dans la nouvelle activité Sequence ajoutée :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Runtime

    TerminateWorkflow

  86. Faites glisser l'activité suivante dans la branche Else de l'activité If :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    Après l'ajout des activités, l'état Commande traitée ressemble à ceci :

    État de commande traitée

  87. Cliquez sur l'activité Sequence dans la branche la plus à gauche de l'activité Parallel, puis cliquez sur Variables au bas du flux de travail pour ouvrir le panneau Variables.

  88. Dans le panneau Variables, cliquez sur Créer une variable, puis créez les variables suivantes :

    Nom de la variable Type de variable Étendue Remarque

    cancelShippingAcknowledgement

    String

    Parallel

    ShippingServiceResult

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ShippingServiceResult

    Sequence

    shippingServiceAcknowledgement

    String

    Sequence

  89. Dans le flux de travail, cliquez sur la première activité Assign dans le haut de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Initialiser isUpdated

    To

    isUpdated

    Valeur

    False

  90. Dans le flux de travail, cliquez sur l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Completion

    isUpdated Or isShipped

    DisplayName

    Expédier commande

  91. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Expédition

  92. Dans le flux de travail, cliquez sur l'activité ShipOrder dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Expédier commande

    poID

    po.POID

    ShipOrderResult

    shippingServiceAcknowledgement

  93. Dans le flux de travail, cliquez sur l'activité Receive dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data:shippingServiceResult; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ShippingServiceResult

    DisplayName

    Recevoir résultat de l'expédition

    OperationName

    SubmitShippingResult

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (effacé)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:ShippingServiceResult/xg0:POID

    CorrelationWith

    correlationOrderWorkflow

  94. Dans le flux de travail, cliquez sur l'activité Assign dans la branche la plus à gauche de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Définir balise isShipped

    To

    isShipped

    Valeur

    True

    Vous avez fini de configurer la branche la plus à gauche de l'activité Parallel.

  95. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    En attente de mise à jour

  96. Dans le flux de travail, cliquez sur l'activité Receive dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data:poUpdate; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Recevoir mise à jour

    OperationName

    SubmitUpdate

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (effacé)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:PurchaseOrder/xg0:POID

    CorrelationWith

    correlationOrderWorkflow

  97. Dans le flux de travail, cliquez sur l'activité SendReplyToReceive dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data: “Mise à jour du bon de commande reçue”; Message type: String

    DisplayName

    Accuser réception de la mise à jour

  98. Dans le flux de travail, cliquez sur l'activité CancelShipping dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    CancelShippingResult

    cancelShippingAcknowledgement

    DisplayName

    Annuler expédition

    orderID

    poUpdate.POID
  99. Dans le flux de travail, cliquez sur l'activité If dans la branche médiane de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Condition

    cancelShippingAcknowledgement = "The shipping process has been terminated successfully."

    DisplayName

    Vérifier état d'annulation

  100. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Séquence de réussite d'annulation

  101. Dans le flux de travail, cliquez sur la première activité Assign dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Actualiser bon de commande

    To

    po

    Valeur

    poUpdate
  102. Dans le flux de travail, cliquez sur la deuxième activité Assign dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Définir balise isUpdated

    To

    isUpdated

    Valeur

    True
  103. Dans le flux de travail, cliquez sur l'activité SendNotification dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order has updated upon your request. The order is under processing."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Updated (by customer)"

    To

    po.EmailAddress
  104. Dans le flux de travail, cliquez sur l'activité SendNotification dans la branche Else de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order update request cannot be processed. The order has been shipped."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Update (by customer) Failed"

    To

    po.EmailAddress

    Vous avez fini de configurer la branche médiane de l'activité Parallel.

  105. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Attente de l'annulation

  106. Dans le flux de travail, cliquez sur l'activité Receive dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data:poID; Message type:String

    DisplayName

    Recevoir annulation

    OperationName

    SubmitCancellation

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (effacé)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:string

    CorrelationWith

    correlationOrderWorkflow

  107. Dans le flux de travail, cliquez sur l'activité SendReplyToReceive dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Contenu

    Message; Message data: “Annulation du bon de commande reçue”; Message type: String

    DisplayName

    Accuser réception de l'annulation

  108. Dans le flux de travail, cliquez sur l'activité CancelShipping dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    CancelshippingResult

    cancelShippingAcknowledgement

    DisplayName

    Annuler expédition

    poID

    po.POID
  109. Dans le flux de travail, cliquez sur l'activité If dans la branche la plus à droite de l'activité Parallel, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Condition

    cancelShippingAcknowledgement = "The shipping process has been terminated successfully."

    DisplayName

    Vérifier état d'annulation

  110. Dans le flux de travail, cliquez sur l'activité Sequence dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Séquence de réussite d'annulation

  111. Dans le flux de travail, cliquez sur l'activité SendNotification dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "We are sorry you chose to cancel your order. If there is anything we can do to help you with our order process or with our products or services please do not hesitate to contact us."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Cancelled (by cusotmer)"

    To

    po.EmailAddress
  112. Dans le flux de travail, cliquez sur l'activité TerminateWorkflow dans la branche Then de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    DisplayName

    Arrêter flux de travail

    Reason

    “Client cancellation”
  113. Dans le flux de travail, cliquez sur la deuxième activité SendNotification dans la branche Else de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order cancellation request cannot be processed. The order has been shipped.

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~Order Cancellation(by customer) Failed"

    To

    po.EmailAddress

    Vous avez fini de configurer la branche la plus à droite de l'activité Parallel.

  114. Sous le nom d'onglet, cliquez sur Service de commande pour afficher l'activité Flowchart « Service de commande ».

  115. Dans le flux de travail, double-cliquez sur l'activité Sequence Commande exécutée pour implémenter l'état

  116. Faites glisser les activités suivantes de la Boîte à outils vers le flux de travail dans l'ordre indiqué :

    Catégorie Activité Remarque

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  117. Dans le flux de travail, cliquez sur la deuxième activité SendNotification dans la branche Else de l'activité If, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Body

    "Your order has been shipped.  Thank you for shopping at contoso.com."

    DisplayName

    Envoyer notification au client

    Subject

    "Contoso.com Order#" + po.POID + "~~ Order Shipped"

    To

    po.EmailAddress

    Vous avez terminé le développement de flux de travail.

Dans ce fichier de configuration, vous définissez deux points de terminaison et un élément de comportement.

Pour configurer le service de flux de travail de commande à l'aide d'un fichier de configuration

  1. Dans Explorateur de solutions, développez OrderWorkflowService, puis double-cliquez sur Web.config pour l'ouvrir.

  2. Insérez une balise <services> dans la balise <system.serviceModel>.

        <services>
          <service name="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderWorkflow">
            <endpoint address="" binding="basicHttpBinding" contract="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
    

Pour compiler le service de flux de travail de commande

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderWorkflowService, puis cliquez sur Reconstruire. Dans la fenêtre de sortie, vérifiez que la compilation du projet a réussi.

Achèvement du service de traitement de commande

OrderProcessingService et OrderWorkflowService font référence l'un à l'autre. Vous devez donc achever OrderProcessingService après avoir achevé OrderWorkflowService.

Pour ajouter les références de services

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderProcessingService, puis cliquez sur Ajouter une référence de service.

  2. Dans Ajouter une référence de service, cliquez sur Découvrir. Visual Studio doit découvrir les deux services.

  3. Entrez et sélectionnez les valeurs suivantes, puis cliquez sur OK pour créer le service.

    Propriété Valeur

    Services

    OrderWorkflow.xamlx

    Espace de noms

    OrderWorkflowService

Pour modifier OrderProcess.svc

  1. Dans Explorateur de solutions, développez OrderProcessing.svc, puis double-cliquez sur Web.config pour l'ouvrir.

  2. Supprimez le commentaire de la section dans la fonction SendProcessResult, de façon à ce qu'elle ressemble à ceci :

    
    private void SendProcessResult(object state)
    {
        PurchaseOrder po = (PurchaseOrder)state;
    
        WorkItem workItem = new WorkItem(Thread.CurrentThread);
        WorkItemMap.Add(po.POID, workItem);
    
        //Simulating the order processing process
        Thread.Sleep(120000);
    
        //The following portion will be uncommented after referencing OrderWorkflowService
        OrderWorkflowService.ProcessServiceResult reply = new OrderWorkflowService.ProcessServiceResult();
        reply.POID = po.POID;
        reply.Message = "The order has been processed successfully.";
    
        lock (workItem.WorkItemLock)
        {
            using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
            {
                client.SubmitProcessResult(reply);
            }
    
            workItem.Complete();
            WorkItemMap.Remove(po.POID);
        }
    
    }
    

Pour compiler le service de traitement de commande

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderProcessingService, puis cliquez sur Reconstruire. Dans la fenêtre de sortie, vérifiez que la compilation du projet a réussi.

Achèvement du service d'expédition

ShippingService et OrderWorkflowService font référence l'un à l'autre. Vous devez donc achever ShippingService après avoir achevé OrderWorkflowService.

Pour ajouter les références de services

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur ShippingService, puis cliquez sur Ajouter une référence de service.

  2. Dans Ajouter une référence de service, cliquez sur Découvrir. Visual Studio doit découvrir les deux services.

  3. Entrez et sélectionnez les valeurs suivantes, puis cliquez sur OK pour créer le service.

    Propriété Valeur

    Services

    OrderWorkflow.xamlx

    Espace de noms

    OrderWorkflowService

Pour modifier Shipping.svc

  1. Dans Explorateur de solutions, développez ShippingService, puis double-cliquez sur Shipping.config pour l'ouvrir.

  2. Supprimez le commentaire de la section dans la fonction SendShippingResult, de façon à ce qu'elle ressemble à ceci :

    private void SendShippingResult(object state)
    {
        string poID = state.ToString();
    
        WorkItem workItem = new WorkItem(Thread.CurrentThread);
        WorkItemMap.Add(poID, workItem);
    
        //Simulating the order processing process
        Thread.Sleep(60000);
    
        //The following portion will be uncommented after referencing OrderWorkflowService
        OrderWorkflowService.ShippingServiceResult reply = new OrderWorkflowService.ShippingServiceResult();
        reply.POID = poID;
        reply.Message = "The order has been shipped.";
    
        lock (workItem.WorkItemLock)
        {
            using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
            {
                client.SubmitShippingResult(reply);
            }
    
            workItem.Complete();
            WorkItemMap.Remove(poID);
        }
    }
    

Pour compiler le service d'expédition

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet ShippingService, puis cliquez sur Reconstruire. Dans la fenêtre de sortie, vérifiez que la compilation du projet a réussi.

Développement de l'application cliente de commande

Dans cette étape, vous allez développer une application cliente Windows Form.

Pour ajouter un projet d'application Windows Form à la solution

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur Solution ‘OrderService’, pointez sur Ajouter, puis cliquez sur Nouveau projet.

  2. Dans Ajouter un nouveau projet, choisissez ou tapez les valeurs suivantes, puis cliquez sur OK.

    Propriété Valeur

    Types de projets

    Visual C#/Windows

    Modèles

    Application Windows Forms

    Nom

    OrderClient

    Emplacement

    C:\DublinTutorial\OrderServiceSolution\OrderService

Le client de commande est une interface du service de flux de travail. Vous devez ajouter une référence de service au service de flux de travail.

Pour ajouter la référence de service

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderClient, puis cliquez sur Ajouter une référence de service.

  2. Dans Ajouter une référence de service, cliquez sur Découvrir.

  3. Entrez et sélectionnez les valeurs suivantes, puis cliquez sur OK pour créer le service.

    Propriété Valeur

    Services

    OrderWorkflow.xamlx

    Espace de noms

    OrderWorkflowService

Pour développer le formulaire Windows Form

  1. Dans Explorateur de solutions, développez OrderClient, puis double-cliquez sur Form1.cs pour l'ouvrir.

  2. Cliquez avec le bouton droit sur Form1.cs, cliquez sur Renommer, puis tapez OrderForm.cs.

  3. À l'invite, cliquez sur Oui.

  4. Dans la boîte à outils, ajoutez les quatre contrôles Label, cinq contrôles TextBox et trois contrôles Button au formulaire, puis alignez les contrôles de façon à ce qu'ils se présentent comme dans la capture d'écran suivante :

    Formulaire client de commande

  5. Dans le flux de travail, cliquez sur le formulaire, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    OrderForm

    Texte

    Contoso.com Order Form

  6. Dans le flux de travail, cliquez sur label1, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    lblOrderNumber

    Texte

    Numéro de commande :

  7. Dans le flux de travail, cliquez sur label2, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    lblEmail

    Texte

    Adresse de messagerie :

  8. Dans le flux de travail, cliquez sur label3, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    lblDescription

    Texte

    Description :

  9. Dans le flux de travail, cliquez sur label4, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    lblQuantity

    Texte

    Quantité :

  10. Dans le flux de travail, cliquez sur textbox1, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    txtOrderNumber

    Activé

    False

  11. Dans le flux de travail, cliquez sur textbox2, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    txtEmail

    Texte

    JohnDole@fabrikam.com

  12. Dans le flux de travail, cliquez sur textbox3, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    txtDescription

    Texte

    Windows 7

  13. Dans le flux de travail, cliquez sur textbox4, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    txtQuantity

    Texte

    10

  14. Dans le flux de travail, cliquez sur textbox5, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    txtStatus

    Anchor

    Bottom, Left, Right

    Activé

    False

    Texte

    “”

  15. Dans le flux de travail, cliquez sur button1, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    btnSubmit

    Anchor

    Bottom, Right

    Texte

    Soumettre

    Cliquer (sous l'onglet Événement)

    btnSubmit_Click

  16. Dans le flux de travail, cliquez sur button2, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    btnUpdate

    Anchor

    Bottom, Right

    Texte

    Mettre à jour

    Cliquer (sous l'onglet Événement)

    btnUpdate_Click

  17. Dans le flux de travail, cliquez sur button3, puis, dans le panneau Propriétés, définissez les valeurs suivantes.

    Propriété Valeur

    Nom

    btnCancel

    Anchor

    Bottom, Right

    Texte

    Annuler

    Cliquer (sous l'onglet Événement)

    btnCancel_Click

  18. Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderForm.cs, puis cliquez sur Afficher le code.

  19. Cliquez avec le bouton droit sur l'espace de noms OrderClient, cliquez sur Refactoriser, puis sur Renommer pour ouvrir la boîte de dialogue Renommer.

  20. Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient, puis cliquez sur OK.

  21. Cliquez sur Appliquer.

  22. Remplacez le code par le suivant :

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient
    {
        public partial class OrderForm : Form
        {
            //Delegates to make all service calls on a secondary thread
            private delegate void SubmitOrderDelegate();
            private delegate void CancelOrderDelegate();
            private delegate void UpdateOrderDelegate();
            private delegate void CallbackDelegate(string poID, string str);
    
            private SubmitOrderDelegate SubmitOrderHandler;
            private CancelOrderDelegate CancelOrderHandler;
            private UpdateOrderDelegate UpdateOrderHandler;
            private CallbackDelegate CallbackHandler;
    
            public OrderForm()
            {
                InitializeComponent();
            }
    
            private void OrderForm_Load(object sender, EventArgs e)
            {
                btnUpdate.Enabled = false;
                btnCancel.Enabled = false;
                btnSubmit.Focus();
            }
    
            #region Submit button
            private void btnSubmit_Click(object sender, EventArgs e)
            {
                btnSubmit.Enabled = false;
                btnCancel.Enabled = false;
                btnUpdate.Enabled = false;
                txtEmail.Enabled = false;
    
                txtStatus.Text = "Connecting to the Order service ...";
    
                //Executed on secondary thread so the UI thread is not blocked
                SubmitOrderHandler = new SubmitOrderDelegate(this.SubmitOrder);
                SubmitOrderHandler.BeginInvoke(null, null);
            }
    
            private void SubmitOrder()
            {
                string strMessage = "Your order has been received.";
                string strPOID = "";
    
                OrderWorkflowService.PurchaseOrder po = new OrderWorkflowService.PurchaseOrder();
                po.EmailAddress = txtEmail.Text;
                po.Description = txtDescription.Text;
                po.Quantity = System.Int32.Parse(txtQuantity.Text);
    
                //A Blocking service call executed on secondary thread
                try
                {
                    OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient();
                    strPOID = client.SubmitPO(po);
                    client.Close();
                }
                catch (Exception Ex)
                {
                    strMessage = "Error: " + Ex.Message;
                }
    
                //Make UI updates back on the primary thread
                CallbackHandler = new CallbackDelegate(this.SubmitOrderCallBack);
                this.BeginInvoke(CallbackHandler, strPOID, strMessage);
    
            }
    
            private void SubmitOrderCallBack(string strPOID, string strMessage)
            {
                //UI updates back on the primary thread
                btnUpdate.Enabled = true;
                btnCancel.Enabled = true;
    
                txtOrderNumber.Text = strPOID;
                txtStatus.Text = strMessage;
            }
            #endregion
    
            #region Update button
            private void btnUpdate_Click(object sender, EventArgs e)
            {
                btnUpdate.Enabled = false;
                btnCancel.Enabled = false;
    
                txtStatus.Text = "Connecting to the Order service ...";
    
                //Executed on secondary thread so the UI thread is not blocked
                UpdateOrderHandler = new UpdateOrderDelegate(this.UpdateOrder);
                UpdateOrderHandler.BeginInvoke(null, null);
    
            }
    
            private void UpdateOrder()
            {
                string strMessage = "Your order update request has been received.";
                string strPOID = "";
    
                OrderWorkflowService.PurchaseOrder po = new OrderWorkflowService.PurchaseOrder();
                po.POID = txtOrderNumber.Text;
                po.EmailAddress = txtEmail.Text;
                po.Description = txtDescription.Text;
                po.Quantity = System.Int32.Parse(txtQuantity.Text);
    
                try
                {
                    OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient();
                    strMessage = client.SubmitUpdate(po);
                    client.Close();
                }
                catch (Exception Ex)
                {
                    strMessage = "Error: " + Ex.Message;
                }
    
                //Make UI updates back on the primary thread
                CallbackHandler = new CallbackDelegate(this.UpdateOrderCallback);
                this.BeginInvoke(CallbackHandler, strPOID, strMessage);
    
            }
    
            private void UpdateOrderCallback(string strPOID, string strMessage)
            {
                //UI updates back on the primary thread
                btnUpdate.Enabled = true;
                btnCancel.Enabled = true;
    
                txtStatus.Text = strMessage;
            }
            #endregion
    
            #region Cancel button
            private void btnCancel_Click(object sender, EventArgs e)
            {
                btnUpdate.Enabled = false;
                btnCancel.Enabled = false;
    
                txtStatus.Text = "Connecting to the Order service ...";
    
                //Executed on secondary thread so the UI thread is not blocked
                CancelOrderHandler = new CancelOrderDelegate(this.CancelOrder);
                CancelOrderHandler.BeginInvoke(null, null);
            }
    
            private void CancelOrder()
            {
                string strInOut = txtOrderNumber.Text;
    
                try
                {
                    OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient();
                    client.SubmitCancellation(ref strInOut);
                    client.Close();
                }
                catch (Exception Ex)
                {
                    strInOut = "Error: " + Ex.Message;
                }
    
                //Make UI updates back on the primary thread
                CallbackHandler = new CallbackDelegate(this.CancelOrderCallback);
                this.BeginInvoke(CallbackHandler, txtOrderNumber.Text, strInOut);
            }
    
            private void CancelOrderCallback(string strPOID, string strMessage)
            {
                //UI updates back on the primary thread
                //btnUpdate.Enabled = true;
                //btnCancel.Enabled = true;
    
                txtStatus.Text = strMessage;
            }
            #endregion
        }
    }
    

Pour compiler le client de commande

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderClient, puis cliquez sur Reconstruire. Dans la fenêtre de sortie, vérifiez que la compilation du projet a réussi.

Test du service de commande

Pour tester le service de commande

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderClient, puis cliquez sur Définir en tant que projet de démarrage.

  2. Dans Visual Studio, cliquez sur le menu Déboguer, puis sur Démarrer le débogage. Un formulaire Windows Form doit s'afficher.

  3. Dans le formulaire, cliquez sur Soumettre.

  4. Ouvrez l'Explorateur Windows et accédez au dossier C:\DublinTutorial\Inbox.

  5. Attendez de voir les trois notifications par courrier électronique. Il faut entre trois et quatre minutes pour afficher les trois fichiers.

Empaquetage du service de commande

Pour empaqueter le service WCF OrderProcessingService

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderProcessingService, puis cliquez sur Paramètres d'empaquetage/publication.

  2. Entrez les valeurs suivantes :

    Propriété Valeur

    Créer un package Web comme fichier ZIP

    (sélectionné)

    Emplacement de création du package

    C:\DublinTutorial\DeploymentPackages\OrderProcessingService.zip

    Nom de site Web IIS/d'application à utiliser sur le serveur de destination

    OrderService/OrderProcessingService

  3. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderProcessingService, puis cliquez sur Créer le package.

  4. Procédez de la même manière pour créer des packages pour les trois autres projets avec les paramètres suivants :

    Nom de projet Emplacement de création du package Nom de site Web IIS/d'application à utiliser sur le serveur de destination

    OrderWorkflowService

    C:\DublinTutorial\DeploymentPackages\OrderWorkflowService.zip

    OrderService/OrderWorkflowService

    ShippingService

    C:\DublinTutorial\DeploymentPackages\ShippingService.zip

    OrderService/ShippingService

    Notes

    Vous pourriez envisager de mettre à jour les adresses de point de terminaison des services dépendants dans les fichiers Web.config afin qu'elles reflètent le serveur sur lequel les packages seront déployés avant d'empaqueter un service.

Voir aussi

Concepts

Didacticiel utilisant l'interface de Windows Server AppFabric
Didacticiel utilisant Windows PowerShell

  2011-12-05