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 :
Développement du service WCF de traitement de commande
Développement du service WCF d'expédition
Développement du service WCF de flux de travail de commande
Achèvement du service WCF de traitement de commande
Achèvement du service WCF d'expédition
Développement de l'application cliente de commande
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
Cliquez sur Démarrer, pointez sur Tous les programmes, puis sur Microsoft Visual Studio 2010, puis cliquez sur Microsoft Visual Studio 2010.
Dans le menu Fichier, cliquez sur Nouveau, puis sur Nouveau projet.
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é)
Dans Explorateur de solutions, développez OrderProcessingService, cliquez avec le bouton droit sur IService1.cs, puis cliquez sur Supprimer.
Cliquez sur OK pour confirmer la suppression définitive du fichier.
Dans Explorateur de solutions, développez OrderProcessingService, cliquez avec le bouton droit sur Service1.svc, puis cliquez sur Supprimer.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderProcessService, pointez sur Ajouter, puis cliquez sur Nouvel élément.
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.
Dans Explorateur de solutions, double-cliquez sur IOrderProcessing.cs pour l'ouvrir.
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.
Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService, puis cliquez sur OK.
Cliquez sur Appliquer, puis sur Oui.
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
Dans Explorateur de solutions, double-cliquez sur IOrderProcessing.cs pour l'ouvrir.
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
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
- 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
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.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur Solution ‘OrderService’, pointez sur Ajouter, puis cliquez sur Nouveau projet.
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
Dans Explorateur de solutions, développez ShippingService, cliquez avec le bouton droit sur IService1.cs, puis cliquez sur Supprimer.
Cliquez sur OK pour confirmer la suppression définitive du fichier.
Dans Explorateur de solutions, développez ShippingService, cliquez avec le bouton droit sur Service1.svc, puis cliquez sur Supprimer.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur ShippingService, pointez sur Ajouter, puis cliquez sur Nouvel élément.
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.
Dans Explorateur de solutions, double-cliquez sur IShipping.cs pour l'ouvrir.
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.
Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService, puis cliquez sur OK.
Cliquez sur Appliquer, puis sur Oui.
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
Dans Explorateur de solutions, double-cliquez sur Shipping.svc pour l'ouvrir.
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
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
- 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
Dans Explorateur de solutions, cliquez avec le bouton droit sur Solution ‘OrderService’, pointez sur Ajouter, puis cliquez sur Nouveau projet.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderWorkflowService, puis cliquez sur Ajouter une référence de service.
Dans Ajouter une référence de service, cliquez sur Découvrir. Visual Studio doit découvrir les deux services.
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
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderWorkflowService, pointez sur Ajouter, puis cliquez sur Nouvel élément.
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
Dans Explorateur de solutions, double-cliquez sur SendNotification.cs pour l'ouvrir.
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.
Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService, puis cliquez sur OK.
Cliquez sur Appliquer, puis sur Oui.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderWorkflowService, pointez sur Ajouter, puis cliquez sur Nouvel élément.
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
Dans Explorateur de solutions, double-cliquez sur DataTypes.cs pour l'ouvrir.
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; } }
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 :
composer le flux de travail à l'aide d'activités ;
définir des variables ;
configurer les activités.
Pour définir le flux de travail
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.
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.
Cliquez avec le bouton droit sur l'activité Sequential Service, puis cliquez sur Supprimer.
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
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.
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 :
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 ».
Utilisez le pointeur de la souris pour connecter les activités de façon à ce qu'elles ressemblent à ceci :
Au bas du flux de travail, cliquez sur Variables pour ouvrir le panneau Variables.
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 :
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
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
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
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
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
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
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.
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.
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.
Réorganisez les activités pour qu'elles ressemblent à ceci :
Au bas du flux de travail, cliquez sur Variables pour ouvrir le panneau Variables.
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.
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é)
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()
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
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.
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
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
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.
Sous le nom d'onglet, cliquez sur Service de commande pour afficher l'activité Flowchart « Service de commande ».
Dans le flux de travail, double-cliquez sur l'activité Sequence Commande ouverte pour implémenter l'état
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
Faites glisser l'activité suivante dans l'activité Parallel :
Catégorie Activité Remarque Flux de contrôle
Sequence
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
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.
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
Faites glisser l'activité suivante dans la branche Then de l'activité If :
Catégorie Activité Remarque Flux de contrôle
Sequence
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
Faites glisser l'activité suivante dans la branche Else de l'activité If :
Catégorie Activité Remarque Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SenNotification
Faites glisser l'activité suivante dans la branche la plus à droite de l'activité Parallel :
Catégorie Activité Remarque Messaging
ReceiveAndSendReply
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
Faites glisser l'activité suivante dans la branche Then de l'activité If :
Catégorie Activité Remarque Flux de contrôle
Sequence
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
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 :
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.
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Sous le nom d'onglet, cliquez sur Service de commande pour afficher l'activité Flowchart « Order service ».
Dans le flux de travail, double-cliquez sur l'activité Sequence Commande traitée pour implémenter l'état
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
Faites glisser l'activité suivante dans l'activité Parallel :
Catégorie Activité Remarque Flux de contrôle
Sequence
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
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.
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
Faites glisser l'activité suivante dans la branche Then de l'activité If :
Catégorie Activité Remarque Flux de contrôle
Sequence
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
Faites glisser l'activité suivante dans la branche Else de l'activité If :
Catégorie Activité Remarque Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SendNotification
Faites glisser l'activité suivante dans la branche la plus à droite de l'activité Parallel :
Catégorie Activité Remarque Messaging
ReceiveAndSendReply
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
Faites glisser l'activité suivante dans la branche Then de l'activité If :
Catégorie Activité Remarque Flux de contrôle
Sequence
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
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 :
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.
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Sous le nom d'onglet, cliquez sur Service de commande pour afficher l'activité Flowchart « Service de commande ».
Dans le flux de travail, double-cliquez sur l'activité Sequence Commande exécutée pour implémenter l'état
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
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
Dans Explorateur de solutions, développez OrderWorkflowService, 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.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
- 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
Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderProcessingService, puis cliquez sur Ajouter une référence de service.
Dans Ajouter une référence de service, cliquez sur Découvrir. Visual Studio doit découvrir les deux services.
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
Dans Explorateur de solutions, développez OrderProcessing.svc, puis double-cliquez sur Web.config pour l'ouvrir.
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
- 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
Dans Explorateur de solutions, cliquez avec le bouton droit sur ShippingService, puis cliquez sur Ajouter une référence de service.
Dans Ajouter une référence de service, cliquez sur Découvrir. Visual Studio doit découvrir les deux services.
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
Dans Explorateur de solutions, développez ShippingService, puis double-cliquez sur Shipping.config pour l'ouvrir.
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
- 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
Dans Explorateur de solutions, cliquez avec le bouton droit sur Solution ‘OrderService’, pointez sur Ajouter, puis cliquez sur Nouveau projet.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderClient, puis cliquez sur Ajouter une référence de service.
Dans Ajouter une référence de service, cliquez sur Découvrir.
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
Dans Explorateur de solutions, développez OrderClient, puis double-cliquez sur Form1.cs pour l'ouvrir.
Cliquez avec le bouton droit sur Form1.cs, cliquez sur Renommer, puis tapez OrderForm.cs.
À l'invite, cliquez sur Oui.
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 :
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
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 :
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 :
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 :
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é :
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
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
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
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
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
“”
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
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
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur OrderForm.cs, puis cliquez sur Afficher le code.
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.
Dans Nouveau nom, tapez Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient, puis cliquez sur OK.
Cliquez sur Appliquer.
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
- 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
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.
Dans Visual Studio, cliquez sur le menu Déboguer, puis sur Démarrer le débogage. Un formulaire Windows Form doit s'afficher.
Dans le formulaire, cliquez sur Soumettre.
Ouvrez l'Explorateur Windows et accédez au dossier C:\DublinTutorial\Inbox.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderProcessingService, puis cliquez sur Paramètres d'empaquetage/publication.
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
Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet OrderProcessingService, puis cliquez sur Créer le package.
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