Condividi tramite


Appendice A: sviluppo dell'applicazione per gli ordini

In questa appendice vengono fornite le procedure dettagliate che consentono agli sviluppatori di generare l'applicazione OrderService Contoso. Lo scopo di questa appendice è consentire agli sviluppatori di acquisire familiarità con lo sviluppo di applicazioni che includono Windows Communication Foundation (WCF) e/o i servizi Windows Workflow Foundation (WF) utilizzando Visual Studio 2010 e .NET Framework 4. Nella parte principale dell'esercitazione viene utilizzata questa applicazione per mostrare agli amministratori di sistema o ai proprietari delle applicazioni come utilizzare Microsoft AppFabric 1.1 per Windows Server per distribuire e monitorare le applicazioni che comprendono WCF e/o i servizi WF nonché risolverne i problemi.

L'applicazione servizio OrderService Contoso è costituito dalle quattro applicazioni seguenti:

  • Servizio Elaborazione ordini: un servizio WCF che simula la chiamata a un'applicazione di elaborazione ordini esistente tramite le interfacce dei servizi Web.

  • Servizio Spedizione: un servizio WCF che simula la chiamata a un'applicazione di spedizione esistente tramite le API.

  • Servizio Flusso di lavoro ordine: un servizio di flusso di lavoro WF che gestisce i processi correlati agli ordini, dalla ricezione, all'elaborazione e alla spedizione.

  • Client Gestione ordini: un'applicazione Windows Form che funge da front-end per il servizio OrderService.

Nota

L'appendice non richiede l'installazione di Windows Server AppFabric. Affinché l'appendice venga creata correttamente, è tuttavia necessario installare innanzitutto i file dell'Esercitazione con l'interfaccia di Microsoft AppFabric 1.1 per Windows Server per creare una struttura di file appropriata. Non è necessario seguire e completare prima l'Esercitazione con l'interfaccia di Microsoft AppFabric 1.1 per Windows Server: per l'appendice è sufficiente installare i file. Per la procedura di installazione dell'Esercitazione con l'interfaccia di Microsoft AppFabric 1.1 per Windows Server, vedere Lezione 1: guida introduttiva. La cartella C:\DublinTutorial\OrderServiceSolution\Completed contiene una copia della soluzione completa.

Procedura

Per creare l'applicazione, sarà necessario completare le fasi seguenti:

  1. Sviluppo del servizio WCF Elaborazione ordini

  2. Sviluppo del servizio WCF Spedizione

  3. Sviluppo del servizio WCF Flusso di lavoro ordine

  4. Completamento del servizio WCF Elaborazione ordini

  5. Completamento del servizio WCF Spedizione

  6. Sviluppo dell'applicazione client Gestione ordini

  7. Creazione del pacchetto del servizio OrderService

Sviluppo del servizio WCF Elaborazione ordini

Elaborazione ordini è un'applicazione acquistata da Contoso. Viene fornita con i servizi Web con cui possono comunicare altre applicazioni. Per interagire con l'applicazione Elaborazione ordini, uno sviluppatore di Contoso deve sviluppare un servizio WCF chiamato OrderProcessingService

Per creare una soluzione Visual Studio e un'Applicazione servizio WCF per OrderProcessingService

  1. Fare clic su Start, scegliere Programmi, scegliere Microsoft Visual Studio 2010, quindi fare clic su Microsoft Visual Studio 2010.

  2. Nel menu File, fare clic su Nuovo, quindi fare clic su Nuovo progetto.

  3. In Nuovo progetto, selezionare o digitare i valori seguenti, quindi fare clic su OK.

    Proprietà Valore

    Tipi progetto

    Visual C#/Web

    Modelli

    Applicazione servizio WCF

    Nome

    OrderProcessingService

    Percorso

    C:\DublinTutorial\OrderServiceSolution

    Nome soluzione

    OrderService

    Crea directory per soluzione

    (selezionata)

  4. In Esplora soluzioni, espandere OrderProcessingService, fare clic con il pulsante destro del mouse su IService1.cs, quindi fare clic su Elimina.

  5. Fare clic su OK per confermare l'eliminazione definitiva del file.

  6. In Esplora soluzioni, espandere OrderProcessingService, fare clic con il pulsante destro del mouse su Service1.svc, quindi fare clic su Elimina.

  7. Fare clic su OK per confermare l'eliminazione definitiva del file.

La prima attività da eseguire per creare un servizio WCF è la definizione di un contratto. Il contratto specifica le operazioni supportate dal servizio. Un'operazione può essere pensata come metodo del servizio Web. Ogni metodo dell'interfaccia corrisponde a una specifica operazione del servizio. In OrderProcessingService, verranno definiti due metodi, ProcessOrder e CancelOrderProcess.

Per definire il contratto di servizi e il contratto di dati per il servizio Elaborazione ordini

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderProcessService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.

  2. In Aggiungi nuovo elemento - OrderProcessService, selezionare o digitare i valori seguenti, quindi fare clic su Aggiungi.

    Proprietà Valore

    Categorie

    Visual C#/Web

    Modello

    Servizio WCF

    Nome

    OrderProcessing.svc

    Alla soluzione vengono aggiunti due file: IOrderProcessing.cs e OrderProcessing.svc.

  3. In Esplora soluzioni, fare doppio clic sul file IOrderProcessing.cs per aprirlo.

  4. Fare clic con il pulsante destro del mouse sullo spazio dei nomi OrderProcessingService, fare clic su Refactoring, quindi fare clic su Rinomina per aprire la finestra di dialogo Rinomina.

  5. In Nuovo nome, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService, quindi fare clic su OK.

  6. Fare clic su Applica, quindi su .

  7. Modificare il codice sorgente di OrderProcessing.svc in modo che appaia come di seguito riportato:

    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;
        }
    }
    

    In questo file si definiscono i contratti di dati e i contratti di servizi. I client possono chiamare il servizio per elaborare un ordine e per annullare l'elaborazione dell'ordine.

Una volta creati i contratti, definiti tramite un'interfaccia, la fase successiva è l'implementazione dell'interfaccia. Tale attività richiede la creazione di una classe denominata OrderProcessService che implementa l'interfaccia IOrderProcessing definita dall'utente.

Per implementare il contratto di servizi di Elaborazione ordini

  1. In Esplora soluzioni, fare doppio clic sul file IOrderProcessing.cs per aprirlo.

  2. Modificare il codice sorgente in modo che appaia come di seguito riportato:

    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'utilizzo di un file di configurazione offre la flessibilità di fornire i dati di endpoint e i dati di comportamento del servizio al momento della distribuzione anziché in fase di progettazione. In questo file di configurazione, è necessario definire due endpoint.

Per configurare il servizio Elaborazione ordini utilizzando un file di configurazione

  1. In Esplora soluzioni, espandere OrderProcessingService, quindi fare doppio clic sul file Web.config per aprirlo. Aggiungere un tag <services> all'interno del tag <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>
    

Per compilare il servizio WCF Elaborazione ordini

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderProcessingService, quindi fare clic su Ricompila. Accertarsi che il progetto sia stato compilato correttamente nella finestra Output.

Per verificare il servizio WCF Elaborazione ordini

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderProcessingService , quindi fare clic su Visualizza nel browser. Verrà aperta una finestra di Internet Explorer con l'elenco dei file della directory.

  2. Nella finestra di Internet Explorer, fare clic su OrderProcessing.svc. Accertarsi che non venga visualizzato alcun errore.

Sviluppo del servizio WCF Spedizione

Spedizione è un servizio WCF che richiama un archivio SQL Server. Nella simulazione, non verrà effettivamente eseguita una chiamata al database.

Per aggiungere un nuovo progetto Applicazione servizio WCF alla soluzione

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Soluzione ‘OrderService’, scegliere Aggiungi, quindi fare clic su Nuovo progetto.

  2. In Aggiungi nuovo progetto, selezionare o digitare i valori seguenti, quindi fare clic su OK.

    Proprietà Valore

    Tipi progetto

    Visual C#/Web

    Modelli

    Applicazione servizio WCF

    Nome

    ShippingService

    Percorso

    C:\DublinTutorial\OrderServiceSolution\OrderService

  3. In Esplora soluzioni, espandere ShippingService, fare clic con il pulsante destro del mouse su IService1.cs, quindi fare clic su Elimina.

  4. Fare clic su OK per confermare l'eliminazione definitiva del file.

  5. In Esplora soluzioni, espandere ShippingService, fare clic con il pulsante destro del mouse su Service1.svc, quindi fare clic su Elimina.

  6. Fare clic su OK per confermare l'eliminazione definitiva del file.

Definire un contratto di servizi denominato IShipping contenente due contratti di operazione, ShipOrder e CancelShipping.

Per definire il contratto del servizio WCF Spedizione

  1. In Espolora soluzioni, fare clic con il pulsante destro del mouse su ShippingService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.

  2. In Aggiungi nuovo elemento - ShippingService, selezionare o digitare i valori seguenti, quindi fare clic su Aggiungi.

    Proprietà Valore

    Categorie

    Visual C#/Web

    Modello

    Servizio WCF

    Nome

    Shipping.svc

    Al progetto vengono aggiunti due file, IShipping.cs e Shipping.svc.

  3. In Esplora soluzioni, fare doppio clic sul file IShipping.cs per aprirlo.

  4. Fare clic con il pulsante destro del mouse sullo spazio dei nomi ShippingService, fare clic su Refactoring, quindi fare clic su Rinomina per aprire la finestra di dialogo Rinomina.

  5. In Nuovo nome, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService, quindi fare clic su OK.

  6. Fare clic su Applica, quindi su .

  7. Modificare il codice sorgente in modo che appaia come di seguito riportato:

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

Per implementare il contratto del servizio WCF Spedizione

  1. In Esplora soluzioni, fare doppio clic sul file Shipping.svc per aprirlo.

  2. Modificare il codice sorgente in modo che appaia come di seguito riportato:

    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;
            }
        }
    }
    

In questo file di configurazione, è necessario definire due endpoint.

Per configurare il servizio WCF Spedizione utilizzando un file di configurazione

  1. In Esplora soluzioni, espandere ShippingService, quindi fare doppio clic sul file Web.config per aprirlo. Aggiungere un tag <services> all'interno del tag <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>
    

Per compilare il servizio WCF Spedizione

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto ShippingService, quindi fare clic su Ricompila. Accertarsi che il progetto sia stato compilato correttamente nella finestra Output.

Sviluppo del servizio WCF Flusso di lavoro ordine

L'applicazione servizio Flusso di lavoro ordine è la parte più importate dell'intero servizio. Orchestra l'intero processo aziendale. Riceve un ordine di acquisto, quindi richiama OrderProcessingService e ShippingService e infine invia al cliente un messaggio di posta elettronica sullo stato dell'ordine di acquisto.

Per aggiungere un nuovo progetto di Applicazione servizio WCF Flusso di lavoro alla soluzione

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Soluzione ‘OrderService’, scegliere Aggiungi, quindi fare clic su Nuovo progetto.

  2. In Aggiungi nuovo progetto, selezionare o digitare i valori seguenti, quindi fare clic su OK.

    Proprietà Valore

    Tipi progetto

    Visual C#/Flusso di lavoro

    Modelli

    Applicazione servizio WCF Flusso di lavoro

    Nome

    OrderWorkflowService

    Percorso

    C:\DublinTutorial\OrderServiceSolution\OrderService

OrderWorkflowService utilizza OrderProcessingService e ShippingService. È necessario fare riferimento ai due servizi.

Per aggiungere i riferimenti ai servizi

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderWorkflowService, quindi fare clic su Aggiungi riferimento al servizio.

  2. In Aggiungi riferimento al servizio, fare clic su Individua. Visual Studio individuerà entrambi i servizi.

  3. Inserire e selezionare i valori seguenti, quindi fare clic su OK per creare il riferimento al servizio.

    Proprietà Valore

    Servizi

    OrderProcessing.svc

    Spazio dei nomi

    OrderProcessService

  4. Ripetere la procedura per aggiungere un altro riferimento al servizio con i valori seguenti:

    Proprietà Valore

    Servizi

    Spedizione

    Spazio dei nomi

    ShippingService

È necessario definire un'attività di flusso di lavoro personalizzata da utilizzare per simulare l'invio di notifiche di posta elettronica.

Per creare un'attività di codice di flusso di lavoro

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderWorkflowService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.

  2. In Aggiungi nuovo elemento - OrderWorkflowService, selezionare o digitare i valori seguenti, quindi fare clic su Aggiungi.

    Proprietà Valore

    Categorie

    Visual C#/Flusso di lavoro

    Modello

    Attività di codice

    Nome

    SendNotification.cs

  3. In Esplora soluzioni, fare doppio clic sul file SendNotification.cs per aprirlo.

  4. Fare clic con il pulsante destro del mouse sullo spazio dei nomi OrderWorkflowService, fare clic su Refactoring, quindi fare clic su Rinomina per aprire la finestra di dialogo Rinomina.

  5. In Nuovo nome, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService, quindi fare clic su OK.

  6. Fare clic su Applica, quindi su .

  7. Modificare il codice sorgente in modo che appaia come di seguito riportato:

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

    Si noti che il percorso è impostato come hardcoded su “C:\DublinTutorial\Inbox\”.

Nella procedura seguente, verranno definiti i tipi di dati. Tali tipi di dati vengono utilizzati per OrderProcessingService e ShippingService per reinviare i risultati a OrderWorkflowService.

Per definire i tipi di dati

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderWorkflowService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.

  2. In Aggiungi nuovo elemento - OrderWorkflowService, selezionare o digitare i valori seguenti, quindi fare clic su Aggiungi.

    Proprietà Valore

    Categorie

    Visual C#/Codice

    Modello

    File di codice

    Nome

    DataTypes.cs

  3. In Esplora soluzioni, fare doppio clic sul file DataTypes.cs per aprirlo.

  4. Modificare il codice sorgente in modo che appaia come di seguito riportato:

    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. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderWorkflowService, quindi fare clic su Ricompila. È necessario creare il progetto in modo che l'attività del codice sia accessibile dal flusso di lavoro che sarà sviluppato nella fase successiva. La compilazione può inoltre esporre gli endpoint del servizio WCF di riferimento al flusso di lavoro.

La fase successiva è la definizione del flusso di lavoro. Il flusso di lavoro contiene diversi stati. Iniziare con la definizione degli stati, quindi definirne i dettagli. Ogni parte dello sviluppo può contenere le fasi seguenti:

  1. Composizione del flusso di lavoro mediante attività.

  2. Definizione delle variabili.

  3. Configurazione delle attività.

Per definire il flusso di lavoro

  1. In Esplora soluzioni, espandere OrderWorkflowService, fare clic con il pulsante destro del mouse su Service1.xamlx, quindi fare clic su Rinomina. Rinominare il file in OrderWorkflow.xamlx.

  2. In Esplora soluzioni, fare doppio clic sul file OrderWorkflow.xamlx per aprirlo. Nel Servizio sequenziale sono elencate due attività: una è denominata ReceiveRequest, l'altra SendResponse.

  3. Fare clic con il pulsante destro del mouse sull'attività Servizio sequenziale, quindi fare clic su Elimina.

  4. Nel flusso di lavoro, fare clic su Rilascia attività qui e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    configurationName

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

    Nome

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

  5. Fare clic su Casella degli strumenti sulla sinistra della finestra per aprire il pannello Casella degli strumenti e bloccarlo al lato sinistro della finestra.

  6. Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro, nel punto in cui è indicato "Rilascia attività qui".

    Categoria Attività Nota

    Diagramma di flusso

    Diagramma di flusso

    Diagramma di flusso è un'attività composita che contiene un Avvio per impostazione predefinita. Nelle fasi successive saranno aggiunte ad essa ulteriori attività.

  7. Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro nell'ordine indicato:

    Categoria Attività Nota

    Messaggistica

    ReceiveAndSendReply

    Questo è lo stato "Attesa ordine".

    Flusso di controllo

    Sequenza

    Conterrà il secondo stato, "Ordine aperto".

    Diagramma di flusso

    FlowDecision

    L'attività FlowDecision facilita la transizione da uno stato all'altro.

    Flusso di controllo

    Sequenza

    Conterrà il terzo stato, "Ordine elaborato".

    Diagramma di flusso

    FlowDecision

    L'attività FlowDecision facilita la transizione da uno stato all'altro.

    Flusso di controllo

    Sequenza

    Conterrà l'ultimo stato, "Ordine elaborato".

  8. Utilizzare il puntatore del mouse per collegare le attività nel modo seguente:

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

  9. Fare clic su Variabili nella parte inferiore del flusso di lavoro per aprire il pannello Variabili.

  10. Nel pannello Variabili, fare clic su Crea variabile, quindi creare le variabili seguenti:

    Nome variabile Tipo di variabile Ambito Nota

    poID

    Stringa

    Diagramma di flusso

    La variabile poID corrisponde a un numero di GUID e viene utilizzata anche per la correlazione.

    isProcessed

    Booleano

    Diagramma di flusso

    È il flag che indica se un ordine è stato elaborato correttamente.

    isShipped

    Booleano

    Diagramma di flusso

    È il flag che indica se un ordine è stato spedito.

    isUpdated

    Booleano

    Diagramma di flusso

    È il flag che indica se un ordine è stato aggiornato dal cliente.

    po

    PurchaseOrder

    Diagramma di flusso

    È un tipo di dati personalizzato in OrderProcessingService. Contiene le informazioni sull'ordine di acquisto.

    poUpdate

    PurchaseOrder

    Diagramma di flusso

    Contiene le informazioni sull'ordine di acquisto aggiornato quando il cliente desidera aggiornate l'ordine di acquisto.

    correlationorderWorkflow

    CorrelationHandle

    Diagramma di flusso

    È l'handle di correlazione utilizzato sia per il client che si collega al servizio che per il servizio che si collega a OrderProcessService e ShippingService.

    Di seguito viene riportata una screenshot delle variabili create:

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

  11. Nel flusso di lavoro, fare clic su Diagramma di flusso e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Servizio OrderService

  12. Nel flusso di lavoro, fare clic sulla prima attività Sequenza e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Attesa ordine

  13. Nel flusso di lavoro, fare clic sulla seconda attività Sequenza e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Ordine aperto

  14. Nel flusso di lavoro, fare clic sulla terza attività Sequenza e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Ordine elaborato

  15. Nel flusso di lavoro, fare clic sulla quarta attività Sequenza e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Ordine completato

  16. Nel flusso di lavoro, fare clic sulla prima attività FlowDecision e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Condizione

    isProcessed

    FalseLabel

    Aggiornato

    TrueLabel

    Elaborato

  17. Nel flusso di lavoro, fare clic sulla seconda attività FlowDecision e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Condizione

    isShipped

    FalseLabel

    Aggiornato

    TrueLabel

    Spedito

    La struttura principale del flusso di lavoro della macchina a stati è stata definita. A questo punto è necessario definire ciascuno stato.

  18. Nel flusso di lavoro, fare doppio clic su Attesa ordine. Si noti che il percorso è mostrato sotto la scheda. È possibile fare clic su Servizio OrderService per tornare indietro alla pagina in cui viene visualizzato l'intero flusso di lavoro della macchina a stati.

  19. Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro nell'ordine indicato:

    Categoria Attività Nota

    Primitive

    Assegna

    Questa attività Assegna richiama un ID ordine (GUID).

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowSerivce

    SendNotification

    Questa attività personalizzata invia la notifica di posta elettronica al client.

    Primitive

    Assegna

    Questa attività Assegna viene utilizzata per poter monitorare il prodotto dell'ordine di acquisto.

    Primitive

    Assegna

    Questa attività Assegna viene utilizzata per poter monitorare la quantità dell'ordine di acquisto.

  20. Riorganizzare le attività nel modo seguente:

    Attesa delle attività stato ordine

  21. Fare clic su Variabili nella parte inferiore del flusso di lavoro per aprire il pannello Variabili.

  22. Nel pannello Variabili, fare clic su Crea variabile, quindi creare le variabili seguenti:

    Nome variabile Tipo di variabile Ambito Nota

    prodotto

    Stringa

    Attesa ordine

    AppFabric è in grado di tenere traccia delle variabili del flusso di lavoro. Questa variabile viene creata per consentire di tenere traccia del nome prodotto.

    quantità

    Int32

    Attesa ordine

    Questa variabile è per scopi di traccia.

  23. Nel flusso di lavoro, fare clic sull'attività Ricezione e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio: po; Tipo di messaggio: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.Purchaseorder

    DisplayName

    Ricevi ordine di acquisto

    OperationName

    SubmitPO

    SerivceContractName

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

    CanCreateInstance

    (selezionata)

  24. Nel flusso di lavoro, fare clic sulla prima attività Assegna e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Assegna ID ordine di acquisto

    A

    po.POID

    Valore

    System.Guid.NewGuid().ToString()

  25. Nel flusso di lavoro, fare clic sull'attività SendReplyToReceive e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio: po.POID; Tipo di messaggio: stringa

    CorrelationInitializers

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

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

    Nota

    È stata appena effettuata una correlazione. Questo flusso di lavoro presenta sette attività di ricezione: una per il ricevimento dell'ordine di acquisto, una per il ricevimento del risultato del servizio di elaborazione, una per il ricevimento del risultato del servizio di spedizione, due per il ricevimento degli aggiornamenti del client e due per il ricevimento degli annullamenti del client. Una volta ricevuto l'ordine di acquisto, il servizio del flusso di lavoro genera un numero di GUID come numero d'ordine. Si immagini che il servizio del flusso di lavoro riceva molti ordini di acquisto contemporaneamente. Il motore del flusso di lavoro crea un'istanza di flusso di lavoro per ciascuna delle richieste di ordine di acquisto. Il motore del flusso di lavoro deve abbinare (o correlare) le altre sei richieste alle istanze del flusso di lavoro. A tale scopo, il motore del flusso di lavoro richiede un identificativo univoco per ciascuna correlazione. In questo esempio, l'identificativo univoco è il numero d'ordine (GUID). Nella prima attività SendReplyToReceive, occorre definire un Inizializzatore di correlazione. Scegliere il tipo di query Query Inizializzatore di correlazione, che implica che l'identificativo univoco si trova nel messaggio passato all'attività di ricezione. È necessario, inoltre, specificare l'xPath del campo. Oltre all'inizializzatore di correlazione, è necessario specificare anche un Handle di correlazione nel campo CorrelateWith. Un Handle di correlazione è un contenitore per i dati di correlazione che consente il richiamo di tali dati da qualsiasi posizione del flusso di lavoro. Nelle successive ricezioni, occorre specificare lo stesso Handle di correlazione. Nei campi CorrelateOn, specificare la modalità di richiamo del numero d'ordine dal messaggio ricevuto.

  26. Nel flusso di lavoro, fare clic sull'attività SendNotification e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress

  27. Nel flusso di lavoro, fare clic sulla seconda attività Assegna e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Assegna nome prodotto

    A

    prodotto

    Valore

    po.Description

  28. Nel flusso di lavoro, fare clic sulla terza attività Assegna e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Assegna quantità

    A

    quantità

    Valore

    po.Quantity

    L'implementazione dello stato Attesa ordine è terminata.

  29. Sotto il nome della scheda, fare clic su Servizio OrderService per visualizzare l'attività Flusso di lavoro “servizio Gestione ordini”.

  30. Nel flusso di lavoro, fare doppio clic sull'attività Sequenza Ordine aperto per implementare lo stato.

  31. Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro nell'ordine indicato:

    Categoria Attività Nota

    Primitive

    Assegna

    Flusso di controllo

    Parallela

  32. Trascinare l'attività seguente all'interno dell'attività Parallela:

    Categoria Attività Nota

    Flusso di controllo

    Sequenza

  33. Trascinare l'attività seguente all'interno dell'attività Sequenza:

    Categoria Attività Nota

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

    ProcessOrder

    Runtime

    Permanente

    Messaggistica

    Ricezione

    Microsoft.Samples.Dublin.Tutorials.OrderService.orderWorkflowService

    SendNotification

    Primitive

    Assegna

  34. Trascinare l'attività seguente all'intero dell'attività Parallela e alla destra dell'attività Sequenza esistente:

    Categoria Attività Nota

    Messaggistica

    ReceiveAndSendReply

    L'attività ReceiveAndSendReply è un'attività composita con un'attività Sequenza che racchiude un'attività Ricezione e un'attività SendReplyToReceive.

  35. Trascinare le seguenti attività nell'attività Sequenza appena aggiunta e sotto le due attività Ricezione e SendReplyToReceive:

    Categoria Attività Nota

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

    CancelOrderProcess

    Flusso di controllo

    If

  36. Trascinare l'attività seguente all'interno del ramo Then dell'attività If:

    Categoria Attività Nota

    Flusso di controllo

    Sequenza

  37. Trascinare le attività seguenti all'interno dell'attività Sequenza appena aggiunta:

    Categoria Attività Nota

    Primitive

    Assegna

    Primitive

    Assegna

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

  38. Trascinare l'attività seguente all'interno del ramo Else dell'attività If:

    Categoria Attività Nota

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

  39. Trascinare l'attività seguente all'interno dell'attività Parallela in modo che sia il primo ramo da destra.

    Categoria Attività Nota

    Messaggistica

    ReceiveAndSendReply

  40. Trascinare le seguenti attività nell'attività Sequenza appena aggiunta e sotto le due attività Ricezione e SendReplyToReceive:

    Categoria Attività Nota

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

    CancelOrderProcess

    Flusso di controllo

    If

  41. Trascinare l'attività seguente all'interno del ramo Then dell'attività If:

    Categoria Attività Nota

    Flusso di controllo

    Sequenza

  42. Trascinare le attività seguenti all'interno dell'attività Sequenza appena aggiunta:

    Categoria Attività Nota

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    Runtime

    TerminateWorkflow

  43. Trascinare l'attività seguente all'interno del ramo Else dell'attività If:

    Categoria Attività Nota

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    Dopo l'aggiunta delle attività, lo stato Ordine aperto appare come di seguito riportato:

    Stato ordine aperto

  44. Fare clic sull'attività Sequenza nel primo ramo da sinistra dell'attività Parallela, quindi fare clic su Variabili nella parte inferiore del flusso di lavoro per aprire il pannello Variabili.

  45. Nel pannello Variabili, fare clic su Crea variabile, quindi creare le variabili seguenti:

    Nome variabile Tipo di variabile Ambito Nota

    cancelOrderProcessAcknowledgement

    Stringa

    Parallela

    ProcessServiceResult

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

    Sequenza

    processServiceAcknowledgement

    Stringa

    Sequenza

  46. Nel flusso di lavoro, fare clic sull'attività Assegna nella parte superiore dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Inizializza isUpdated

    A

    isUpdated

    Valore

    False

  47. Nel flusso di lavoro, fare clic sull'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Completamento

    isUpdated Or isProcessed

    DisplayName

    Elabora ordine

  48. Nel flusso di lavoro, fare clic sull'attività Sequenza nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Elaborazione

  49. Nel flusso di lavoro, fare clic sull'attività ProcessOrder nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Elabora ordine

    po

    po

    ProcessOrderResult

    processServiceAcknowledgement

  50. Nel flusso di lavoro, fare clic sull'attività Ricezione nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio:processServiceResult; Tipo di messaggio: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ProcessServiceResult

    DisplayName

    Ricevi risultato elaborazione

    OperationName

    SubmitProcessResult

    ServiceContractName

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

    CanCreateInstance

    (deselezionare)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  51. Nel flusso di lavoro, fare clic sull'attività SendNotification nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress
  52. Nel flusso di lavoro, fare clic sull'attività Assegna nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Imposta flag isProcessed

    A

    isProcessed

    Valore

    True

    La configurazione del primo ramo da sinistra dell'attività Parallela è terminata.

  53. Nel flusso di lavoro, fare clic sull'attività Sequenza nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Attesa aggiornamento

  54. Nel flusso di lavoro, fare clic sull'attività Ricezione nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio:poUpdate; Tipo di messaggio: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Ricevi aggiornamento

    OperationName

    SubmitUpdate

    ServiceContractName

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

    CanCreateInstance

    (deselezionare)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  55. Nel flusso di lavoro, fare clic sull'attività SendReplyToReceive nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio: “Aggiornamento ordine di acquisto ricevuto”; Tipo di messaggio: Stringa

    DisplayName

    Conferma ricezione aggiornamento

  56. Nel flusso di lavoro, fare clic sull'attività CancelOrderProcess nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Annulla elaborazione ordine

    orderID

    po.POID
  57. Nel flusso di lavoro, fare clic sull'attività If nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Condizione

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

    DisplayName

    Verifica stato annullamento

  58. Nel flusso di lavoro, fare clic sull'attività Sequenza nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Sequenza annullamento riuscito

  59. Nel flusso di lavoro, fare clic sull'attività Assegna nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Aggiorna ordine di acquisto

    A

    po

    Valore

    poUpdate
  60. Nel flusso di lavoro, fare clic sulla seconda attività Assegna nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Imposta flag isUpdated

    A

    isUpdated

    Valore

    True
  61. Nel flusso di lavoro, fare clic sull'attività SendNotification nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress
  62. Nel flusso di lavoro, fare clic sull'attività SendNotification nel ramo Else dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress

    La configurazione del ramo centrale dell'attività Parallela è terminata.

  63. Nel flusso di lavoro, fare clic sull'attività Sequenza nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Attesa annullamento

  64. Nel flusso di lavoro, fare clic sull'attività Ricezione nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio:poID; Tipo di messaggio:Stringa

    DisplayName

    Ricevi annullamento

    OperationName

    SubmitCancellation

    ServiceContractName

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

    CanCreateInstance

    (deselezionare)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  65. Nel flusso di lavoro, fare clic sull'attività SendReplyToReceive nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio: “Annullamento ordine di lavoro ricevuto”; Tipo di messaggio: Stringa

    DisplayName

    Conferma ricezione annullamento

  66. Nel flusso di lavoro, fare clic sull'attività CancelOrderProcess nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Annulla elaborazione ordine

    orderID

    po.POID
  67. Nel flusso di lavoro, fare clic sull'attività If nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Condizione

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

    DisplayName

    Verifica stato annullamento

  68. Nel flusso di lavoro, fare clic sull'attività Sequenza nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Sequenza annullamento riuscito

  69. Nel flusso di lavoro, fare clic sull'attività SendNotification nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

    "Your order has been cancelled upon your request."

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress
  70. Nel flusso di lavoro, fare clic sull'attività TerminateWorkflow nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Termina flusso di lavoro

    Motivo

    “Client cancellation”
  71. Nel flusso di lavoro, fare clic sulla seconda attività SendNotification nel ramo Else dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress

    La configurazione del primo ramo da destra dell'attività Parallela è terminata.

  72. Sotto il nome della scheda, fare clic su Servizio OrderService per visualizzare l'attività Flusso di lavoro “servizio OrderService”.

  73. Nel flusso di lavoro, fare doppio clic sull'attività Sequenza Ordine elaborato per implementare lo stato.

  74. Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro nell'ordine indicato:

    Categoria Attività Nota

    Primitive

    Assegna

    Flusso di controllo

    Parallela

  75. Trascinare l'attività seguente all'interno dell'attività Parallela:

    Categoria Attività Nota

    Flusso di controllo

    Sequenza

  76. Trascinare l'attività seguente all'interno dell'attività Sequenza:

    Categoria Attività Nota

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

    ShipOrder

    Runtime

    Permanente

    Messaggistica

    Ricezione

    Primitive

    Assegna

  77. Trascinare l'attività seguente all'intero dell'attività Parallela e alla destra dell'attività Sequenza esistente:

    Categoria Attività Nota

    Messaggistica

    ReceiveAndSendReply

    L'attività ReceiveAndSendReply è un'attività composita con un'attività Sequenza che racchiude un'attività Ricezione e un'attività SendReplyToReceive.

  78. Trascinare le attività seguenti nell'attività Sequenza appena aggiunta e sotto le due attività Ricezione e SendReplyToReceive:

    Categoria Attività Nota

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

    CancelShipping

    Flusso di controllo

    If

  79. Trascinare l'attività seguente all'interno del ramo Then dell'attività If:

    Categoria Attività Nota

    Flusso di controllo

    Sequenza

  80. Trascinare le attività seguenti all'interno dell'attività Sequenza appena aggiunta:

    Categoria Attività Nota

    Primitive

    Assegna

    Primitive

    Assegna

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  81. Trascinare l'attività seguente all'interno del ramo Else dell'attività If:

    Categoria Attività Nota

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  82. Trascinare l'attività seguente all'interno dell'attività Parallela in modo che sia il primo ramo da destra.

    Categoria Attività Nota

    Messaggistica

    ReceiveAndSendReply

  83. Trascinare le attività seguenti nell'attività Sequenza appena aggiunta e sotto le due attività Ricezione e SendReplyToReceive:

    Categoria Attività Nota

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

    CancelShipping

    Flusso di controllo

    If

  84. Trascinare l'attività seguente all'interno del ramo Then dell'attività If:

    Categoria Attività Nota

    Flusso di controllo

    Sequenza

  85. Trascinare le attività seguenti all'interno dell'attività Sequenza appena aggiunta:

    Categoria Attività Nota

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Runtime

    TerminateWorkflow

  86. Trascinare l'attività seguente all'interno del ramo Else dell'attività If:

    Categoria Attività Nota

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    Dopo l'aggiunta delle attività, lo stato Ordine elaborato appare come di seguito riportato:

    Stato ordine elaborato

  87. Fare clic sull'attività Sequenza nel primo ramo da sinistra dell'attività Parallela, quindi fare clic su Variabili nella parte inferiore del flusso di lavoro per aprire il pannello Variabili.

  88. Nel pannello Variabili, fare clic su Crea variabile, quindi creare le variabili seguenti:

    Nome variabile Tipo di variabile Ambito Nota

    cancelShippingAcknowledgement

    Stringa

    Parallela

    ShippingServiceResult

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

    Sequenza

    shippingServiceAcknowledgement

    Stringa

    Sequenza

  89. Nel flusso di lavoro, fare clic sull'attività Assegna sull'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Inizializza isUpdated

    A

    isUpdated

    Valore

    False

  90. Nel flusso di lavoro, fare clic sull'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Completamento

    isUpdated Or isShipped

    DisplayName

    Spedisci ordine

  91. Nel flusso di lavoro, fare clic sull'attività Sequenza nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Spedizione

  92. Nel flusso di lavoro, fare clic sull'attività ShipOrder nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Spedisci ordine

    poID

    po.POID

    ShipOrderResult

    shippingServiceAcknowledgement

  93. Nel flusso di lavoro, fare clic sull'attività Ricezione nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio:shippingServiceResult; Tipo di messaggio: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ShippingServiceResult

    DisplayName

    Ricevi risultato spedizione

    OperationName

    SubmitShippingResult

    ServiceContractName

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

    CanCreateInstance

    (deselezionare)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  94. Nel flusso di lavoro, fare clic sull'attività Assegna nel primo ramo da sinistra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Imposta flag isShipped

    A

    isShipped

    Valore

    True

    La configurazione del primo ramo da sinistra dell'attività Parallela è terminata.

  95. Nel flusso di lavoro, fare clic sull'attività Sequenza nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Attesa aggiornamento

  96. Nel flusso di lavoro, fare clic sull'attività Ricezione nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio:poUpdate; Tipo di messaggio: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Ricevi aggiornamento

    OperationName

    SubmitUpdate

    ServiceContractName

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

    CanCreateInstance

    (deselezionare)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  97. Nel flusso di lavoro, fare clic sull'attività SendReplyToReceive nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio: “Aggiornamento ordine di acquisto ricevuto”; Tipo di messaggio: Stringa

    DisplayName

    Conferma ricezione aggiornamento

  98. Nel flusso di lavoro, fare clic sull'attività CancelShipping nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    CancelShippingResult

    cancelShippingAcknowledgement

    DisplayName

    Annulla spedizione

    orderID

    poUpdate.POID
  99. Nel flusso di lavoro, fare clic sull'attività If nel ramo centrale dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Condizione

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

    DisplayName

    Verifica stato annullamento

  100. Nel flusso di lavoro, fare clic sull'attività Sequenza nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Sequenza annullamento riuscito

  101. Nel flusso di lavoro, fare clic sull'attività Assegna nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Aggiorna ordine di acquisto

    A

    po

    Valore

    poUpdate
  102. Nel flusso di lavoro, fare clic sulla seconda attività Assegna nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Imposta flag isUpdated

    A

    isUpdated

    Valore

    True
  103. Nel flusso di lavoro, fare clic sull'attività SendNotification nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress
  104. Nel flusso di lavoro, fare clic sull'attività SendNotification nel ramo Else dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress

    La configurazione del ramo centrale dell'attività Parallela è terminata.

  105. Nel flusso di lavoro, fare clic sull'attività Sequenza nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Attesa annullamento

  106. Nel flusso di lavoro, fare clic sull'attività Ricezione nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio:poID; Tipo di messaggio:Stringa

    DisplayName

    Ricevi annullamento

    OperationName

    SubmitCancellation

    ServiceContractName

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

    CanCreateInstance

    (deselezionare)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  107. Nel flusso di lavoro, fare clic sull'attività SendReplyToReceive nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Contenuto

    Messaggio; Dati del messaggio: “Annullamento ordine di lavoro ricevuto”; Tipo di messaggio: Stringa

    DisplayName

    Conferma ricezione annullamento

  108. Nel flusso di lavoro, fare clic sull'attività If nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    CancelshippingResult

    cancelShippingAcknowledgement

    DisplayName

    Annulla spedizione

    poID

    po.POID
  109. Nel flusso di lavoro, fare clic sull'attività If nel primo ramo da destra dell'attività Parallela e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Condizione

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

    DisplayName

    Verifica stato annullamento

  110. Nel flusso di lavoro, fare clic sull'attività Sequenza nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Sequenza annullamento riuscito

  111. Nel flusso di lavoro, fare clic sull'attività SendNotification nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

    "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

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress
  112. Nel flusso di lavoro, fare clic sull'attività TerminateWorkflow nel ramo Then dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    DisplayName

    Termina flusso di lavoro

    Motivo

    “Client cancellation”
  113. Nel flusso di lavoro, fare clic sulla seconda attività SendNotification nel ramo Else dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress

    La configurazione del primo ramo da destra dell'attività Parallela è terminata.

  114. Sotto il nome della scheda, fare clic su Servizio OrderService per visualizzare l'attività Flusso di lavoro “Servizio OrderService”.

  115. Nel flusso di lavoro, fare doppio clic sull'attività Sequenza Ordine completato per implementare lo stato.

  116. Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro nell'ordine indicato:

    Categoria Attività Nota

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  117. Nel flusso di lavoro, fare clic sulla seconda attività SendNotification nel ramo Else dell'attività If e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Corpo

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

    DisplayName

    Invia notifica client

    Oggetto

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

    A

    po.EmailAddress

    Lo sviluppo del flusso di lavoro è terminato.

In questo file di configurazione, è necessario definire due endpoint e un elemento del comportamento.

Per configurare il servizio Flusso di lavoro ordine utilizzando un file di configurazione

  1. In Esplora soluzioni, espandere OrderWorkflowService, quindi fare doppio clic sul file Web.config per aprirlo.

  2. Aggiungere un tag <services> all'interno del tag <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>
    

Per compilare il servizio Flusso di lavoro ordine

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderWorkflowService, quindi fare clic su Ricompila. Accertarsi che il progetto sia stato compilato correttamente nella finestra Output.

Completamento del servizio Elaborazione ordini

OrderProcessingService e OrderWorkflowService fanno riferimento l'uno all'altro. Di conseguenza, è necessario terminare OrderProcessingService dopo aver terminato OrderWorkflowService.

Per aggiungere i riferimenti ai servizi

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderProcessingService, quindi fare clic su Aggiungi riferimento al servizio.

  2. In Aggiungi riferimento al servizio, fare clic su Individua. Visual Studio individuerà entrambi i servizi.

  3. Inserire e selezionare i valori seguenti, quindi fare clic su OK per creare il riferimento al servizio.

    Proprietà Valore

    Servizi

    OrderWorkflow.xamlx

    Spazio dei nomi

    OrderWorkflowService

Per modificare OrderProcess.svc

  1. In Esplora soluzioni, espandere OrderProcessingService, quindi fare doppio clic sul file OrderProcessing.svc per aprirlo.

  2. Eliminare il carattere che contrassegna come commento la sezione all'interno della funzione SendProcessResult in modo che la funzione appaia come di seguito riportato:

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

Per compilare il servizio Elaborazione ordini

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderProcessingService, quindi fare clic su Ricompila. Accertarsi che il progetto sia stato compilato correttamente nella finestra Output.

Completamento del servizio Spedizione

ShippingService e OrderWorkflowService fanno riferimento l'uno all'altro. Di conseguenza, è necessario terminare ShippingService dopo aver terminato OrderWorkflowService.

Per aggiungere i riferimenti ai servizi

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su ShippingService, quindi fare clic su Aggiungi riferimento al servizio.

  2. In Aggiungi riferimento al servizio, fare clic su Individua. Visual Studio individuerà entrambi i servizi.

  3. Inserire e selezionare i valori seguenti, quindi fare clic su OK per creare il riferimento al servizio.

    Proprietà Valore

    Servizi

    OrderWorkflow.xamlx

    Spazio dei nomi

    OrderWorkflowService

Per modificare Shipping.svc

  1. In Esplora soluzioni, espandere ShippingService, quindi fare doppio clic sul file Shipping.svc per aprirlo.

  2. Eliminare il carattere che contrassegna come commento la sezione all'interno della funzione SendShippingResult in modo che la funzione appaia come di seguito riportato:

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

Per compilare il servizio Spedizione

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto ShippingService, quindi fare clic su Ricompila. Accertarsi che il progetto sia stato compilato correttamente nella finestra Output.

Sviluppo dell'applicazione Client Gestione ordini

In questa fase, verrà sviluppata un'applicazione client Windows Form.

Per aggiungere un progetto di applicazione Windows Form alla soluzione

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Soluzione ‘OrderService’, scegliere Aggiungi, quindi fare clic su Nuovo progetto.

  2. In Aggiungi nuovo progetto, selezionare o digitare i valori seguenti, quindi fare clic su OK.

    Proprietà Valore

    Tipi progetto

    Visual C#/Windows

    Modelli

    Applicazione Windows Forms

    Nome

    OrderClient

    Percorso

    C:\DublinTutorial\OrderServiceSolution\OrderService

Il client Gestione ordini è un'interfaccia per il servizio di flusso di lavoro. È necessario aggiungere un riferimento al servizio del flusso di lavoro.

Per aggiungere il riferimento al servizio

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderClient, quindi fare clic su Aggiungi riferimento al servizio per aprire la finestra di dialogo Aggiungi riferimento al servizio.

  2. In Aggiungi riferimento al servizio, fare clic su Individua.

  3. Inserire e selezionare i valori seguenti, quindi fare clic su OK per creare il riferimento al servizio.

    Proprietà Valore

    Servizi

    OrderWorkflow.xamlx

    Spazio dei nomi

    OrderWorkflowService

Per sviluppare il Windows Form

  1. In Esplora soluzioni, espandere OrderClient, quindi fare doppio clic sul file Form1.cs per aprirlo.

  2. Fare clic con il pulsante destro del mouse su Form1.cs, fare clic su Rinomina, quindi digitare OrderForm.cs.

  3. Al prompt, fare clic su .

  4. Nella Casella degli strumenti aggiungere al modulo i quattro controlli Label, i cinque controlli TextBox e i tre controlli Button.

  5. Nel flusso di lavoro, fare clic sul modulo e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    OrderForm

    Testo

    Modulo d'ordine Contoso.com

  6. Nel flusso di lavoro, fare clic su label1 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    lblOrderNumber

    Testo

    Numero d'ordine:

  7. Nel flusso di lavoro, fare clic su label2 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    lblEmail

    Testo

    Posta elettronica:

  8. Nel flusso di lavoro, fare clic su label3 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    lblDescription

    Testo

    Descrizione:

  9. Nel flusso di lavoro, fare clic su label4 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    lblQuantity

    Testo

    Quantità:

  10. Nel flusso di lavoro, fare clic su textbox1 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    txtOrderNumber

    Attivato

    False

  11. Nel flusso di lavoro, fare clic su textbox2 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    txtEmail

    Testo

    JohnDole@fabrikam.com

  12. Nel flusso di lavoro, fare clic su textbox3 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    txtDescription

    Testo

    Windows 7

  13. Nel flusso di lavoro, fare clic su textbox4 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    txtQuantity

    Testo

    10

  14. Nel flusso di lavoro, fare clic su textbox5 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    txtStatus

    Ancoraggio

    In basso, A sinistra, A destra

    Attivato

    False

    Testo

    “”

  15. Nel flusso di lavoro, fare clic su button1 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    btnSubmit

    Ancoraggio

    In basso, A destra

    Testo

    Invia

    Fare clic (sotto la scheda Evento)

    btnSubmit_Click

  16. Nel flusso di lavoro, fare clic su button2 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    btnUpdate

    Ancoraggio

    In basso, A destra

    Testo

    Aggiorna

    Fare clic (sotto la scheda Evento)

    btnUpdate_Click

  17. Nel flusso di lavoro, fare clic su button3 e impostare i valori seguenti nel pannello Proprietà.

    Proprietà Valore

    Nome

    btnCancel

    Ancoraggio

    In basso, A destra

    Testo

    Annulla

    Fare clic (sotto la scheda Evento)

    btnCancel_Click

  18. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Visualizza codice, quindi fare clic su Ricompila.

  19. Fare clic con il pulsante destro del mouse sullo spazio dei nomi OrderClient, fare clic su Refactoring, quindi fare clic su Rinomina per aprire la finestra di dialogo Rinomina.

  20. In Rinomina, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient, quindi fare clic su OK.

  21. Fare clic su Applica.

  22. Sostituire il codice con quello seguente:

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

Per compilare il client Gestione ordini

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderClient, quindi fare clic su Ricompila. Accertarsi che il progetto sia stato compilato correttamente nella finestra Output.

Verifica del Servizio OrderService

Per verificare il Servizio OrderService

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderClient, quindi fare clic su Imposta come progetto di avvio.

  2. In Visual Studio, fare clic sul menu Debug, quindi su Avvia debug. Si aprirà un Windows Form.

  3. Nel modulo, fare clic su Invia.

  4. Aprire Esplora risorse e individuare la cartella C:\DublinTutorial\Inbox.

  5. Attendere che vengano visualizzate le tre notifiche e-mail. La visualizzazione dei tre file richiede tre o quattro minuti.

Creazione del pacchetto del Servizio OrderService

Per creare il pacchetto del servizio WCF OrderProcessingService

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderProcessingService , quindi fare clic su Pacchetto/Impostazioni di pubblicazione.

  2. Inserire i valori seguenti:

    Proprietà Valore

    Crea pacchetto Web come file ZIP

    (selezionata)

    Percorso in cui sarà creato il pacchetto

    C:\DublinTutorial\DeploymentPackages\OrderProcessingService.zip

    Nome applicazione/sito Web IIS da utilizzare nel server di destinazione

    OrderService/OrderProcessingService

  3. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderProcessingService , quindi fare clic su Crea pacchetto.

  4. Ripetere l'ultima procedura per creare i pacchetti per gli altri tre progetti con le impostazioni seguenti:

    Nome progetto Percorso in cui sarà creato il pacchetto Nome applicazione/sito Web IIS da utilizzare nel server di destinazione

    OrderWorkflowService

    C:\DublinTutorial\DeploymentPackages\OrderWorkflowService.zip

    OrderService/OrderWorkflowService

    ShippingService

    C:\DublinTutorial\DeploymentPackages\ShippingService.zip

    OrderService/ShippingService

    Nota

    Prima di creare il pacchetto di un servizio, può essere utile aggiornare gli indirizzi di endpoint dei servizi dipendenti nei file Web.config in modo che rispecchino il server in cui saranno distribuiti i pacchetti.

Vedere anche

Concetti

Esercitazione con l'interfaccia di AppFabric
Esercitazione con Windows PowerShell

  2012-03-05