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:
Sviluppo del servizio WCF Elaborazione ordini
Sviluppo del servizio WCF Spedizione
Sviluppo del servizio WCF Flusso di lavoro ordine
Completamento del servizio WCF Elaborazione ordini
Completamento del servizio WCF Spedizione
Sviluppo dell'applicazione client Gestione ordini
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
Fare clic su Start, scegliere Programmi, scegliere Microsoft Visual Studio 2010, quindi fare clic su Microsoft Visual Studio 2010.
Nel menu File, fare clic su Nuovo, quindi fare clic su Nuovo progetto.
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)
In Esplora soluzioni, espandere OrderProcessingService, fare clic con il pulsante destro del mouse su IService1.cs, quindi fare clic su Elimina.
Fare clic su OK per confermare l'eliminazione definitiva del file.
In Esplora soluzioni, espandere OrderProcessingService, fare clic con il pulsante destro del mouse su Service1.svc, quindi fare clic su Elimina.
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderProcessService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.
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.
In Esplora soluzioni, fare doppio clic sul file IOrderProcessing.cs per aprirlo.
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.
In Nuovo nome, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService, quindi fare clic su OK.
Fare clic su Applica, quindi su Sì.
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
In Esplora soluzioni, fare doppio clic sul file IOrderProcessing.cs per aprirlo.
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
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
- 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
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.
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su Soluzione ‘OrderService’, scegliere Aggiungi, quindi fare clic su Nuovo progetto.
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
In Esplora soluzioni, espandere ShippingService, fare clic con il pulsante destro del mouse su IService1.cs, quindi fare clic su Elimina.
Fare clic su OK per confermare l'eliminazione definitiva del file.
In Esplora soluzioni, espandere ShippingService, fare clic con il pulsante destro del mouse su Service1.svc, quindi fare clic su Elimina.
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
In Espolora soluzioni, fare clic con il pulsante destro del mouse su ShippingService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.
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.
In Esplora soluzioni, fare doppio clic sul file IShipping.cs per aprirlo.
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.
In Nuovo nome, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService, quindi fare clic su OK.
Fare clic su Applica, quindi su Sì.
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
In Esplora soluzioni, fare doppio clic sul file Shipping.svc per aprirlo.
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
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
- 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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su Soluzione ‘OrderService’, scegliere Aggiungi, quindi fare clic su Nuovo progetto.
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderWorkflowService, quindi fare clic su Aggiungi riferimento al servizio.
In Aggiungi riferimento al servizio, fare clic su Individua. Visual Studio individuerà entrambi i servizi.
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
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderWorkflowService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.
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
In Esplora soluzioni, fare doppio clic sul file SendNotification.cs per aprirlo.
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.
In Nuovo nome, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService, quindi fare clic su OK.
Fare clic su Applica, quindi su Sì.
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderWorkflowService, scegliere Aggiungi, quindi fare clic su Nuovo elemento.
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
In Esplora soluzioni, fare doppio clic sul file DataTypes.cs per aprirlo.
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; } }
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:
Composizione del flusso di lavoro mediante attività.
Definizione delle variabili.
Configurazione delle attività.
Per definire il flusso di lavoro
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.
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.
Fare clic con il pulsante destro del mouse sull'attività Servizio sequenziale, quindi fare clic su Elimina.
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
Fare clic su Casella degli strumenti sulla sinistra della finestra per aprire il pannello Casella degli strumenti e bloccarlo al lato sinistro della finestra.
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à.
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".
Utilizzare il puntatore del mouse per collegare le attività nel modo seguente:
Fare clic su Variabili nella parte inferiore del flusso di lavoro per aprire il pannello Variabili.
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:
Nel flusso di lavoro, fare clic su Diagramma di flusso e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore DisplayName
Servizio OrderService
Nel flusso di lavoro, fare clic sulla prima attività Sequenza e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore DisplayName
Attesa ordine
Nel flusso di lavoro, fare clic sulla seconda attività Sequenza e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore DisplayName
Ordine aperto
Nel flusso di lavoro, fare clic sulla terza attività Sequenza e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore DisplayName
Ordine elaborato
Nel flusso di lavoro, fare clic sulla quarta attività Sequenza e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore DisplayName
Ordine completato
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
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.
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.
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.
Riorganizzare le attività nel modo seguente:
Fare clic su Variabili nella parte inferiore del flusso di lavoro per aprire il pannello Variabili.
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.
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)
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()
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
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.
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
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
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.
Sotto il nome della scheda, fare clic su Servizio OrderService per visualizzare l'attività Flusso di lavoro “servizio Gestione ordini”.
Nel flusso di lavoro, fare doppio clic sull'attività Sequenza Ordine aperto per implementare lo stato.
Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro nell'ordine indicato:
Categoria Attività Nota Primitive
Assegna
Flusso di controllo
Parallela
Trascinare l'attività seguente all'interno dell'attività Parallela:
Categoria Attività Nota Flusso di controllo
Sequenza
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
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.
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
Trascinare l'attività seguente all'interno del ramo Then dell'attività If:
Categoria Attività Nota Flusso di controllo
Sequenza
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
Trascinare l'attività seguente all'interno del ramo Else dell'attività If:
Categoria Attività Nota Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SenNotification
Trascinare l'attività seguente all'interno dell'attività Parallela in modo che sia il primo ramo da destra.
Categoria Attività Nota Messaggistica
ReceiveAndSendReply
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
Trascinare l'attività seguente all'interno del ramo Then dell'attività If:
Categoria Attività Nota Flusso di controllo
Sequenza
Trascinare le attività seguenti all'interno dell'attività Sequenza appena aggiunta:
Categoria Attività Nota Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SenNotification
Runtime
TerminateWorkflow
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:
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.
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Sotto il nome della scheda, fare clic su Servizio OrderService per visualizzare l'attività Flusso di lavoro “servizio OrderService”.
Nel flusso di lavoro, fare doppio clic sull'attività Sequenza Ordine elaborato per implementare lo stato.
Trascinare le attività seguenti dalla Casella degli strumenti al flusso di lavoro nell'ordine indicato:
Categoria Attività Nota Primitive
Assegna
Flusso di controllo
Parallela
Trascinare l'attività seguente all'interno dell'attività Parallela:
Categoria Attività Nota Flusso di controllo
Sequenza
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
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.
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
Trascinare l'attività seguente all'interno del ramo Then dell'attività If:
Categoria Attività Nota Flusso di controllo
Sequenza
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
Trascinare l'attività seguente all'interno del ramo Else dell'attività If:
Categoria Attività Nota Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SendNotification
Trascinare l'attività seguente all'interno dell'attività Parallela in modo che sia il primo ramo da destra.
Categoria Attività Nota Messaggistica
ReceiveAndSendReply
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
Trascinare l'attività seguente all'interno del ramo Then dell'attività If:
Categoria Attività Nota Flusso di controllo
Sequenza
Trascinare le attività seguenti all'interno dell'attività Sequenza appena aggiunta:
Categoria Attività Nota Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SendNotification
Runtime
TerminateWorkflow
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:
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.
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Sotto il nome della scheda, fare clic su Servizio OrderService per visualizzare l'attività Flusso di lavoro “Servizio OrderService”.
Nel flusso di lavoro, fare doppio clic sull'attività Sequenza Ordine completato per implementare lo stato.
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
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
In Esplora soluzioni, espandere OrderWorkflowService, 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.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
- 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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderProcessingService, quindi fare clic su Aggiungi riferimento al servizio.
In Aggiungi riferimento al servizio, fare clic su Individua. Visual Studio individuerà entrambi i servizi.
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
In Esplora soluzioni, espandere OrderProcessingService, quindi fare doppio clic sul file OrderProcessing.svc per aprirlo.
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
- 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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su ShippingService, quindi fare clic su Aggiungi riferimento al servizio.
In Aggiungi riferimento al servizio, fare clic su Individua. Visual Studio individuerà entrambi i servizi.
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
In Esplora soluzioni, espandere ShippingService, quindi fare doppio clic sul file Shipping.svc per aprirlo.
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
- 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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su Soluzione ‘OrderService’, scegliere Aggiungi, quindi fare clic su Nuovo progetto.
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
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.
In Aggiungi riferimento al servizio, fare clic su Individua.
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
In Esplora soluzioni, espandere OrderClient, quindi fare doppio clic sul file Form1.cs per aprirlo.
Fare clic con il pulsante destro del mouse su Form1.cs, fare clic su Rinomina, quindi digitare OrderForm.cs.
Al prompt, fare clic su Sì.
Nella Casella degli strumenti aggiungere al modulo i quattro controlli Label, i cinque controlli TextBox e i tre controlli Button.
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
Nel flusso di lavoro, fare clic su label1 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
lblOrderNumber
Testo
Numero d'ordine:
Nel flusso di lavoro, fare clic su label2 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
lblEmail
Testo
Posta elettronica:
Nel flusso di lavoro, fare clic su label3 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
lblDescription
Testo
Descrizione:
Nel flusso di lavoro, fare clic su label4 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
lblQuantity
Testo
Quantità:
Nel flusso di lavoro, fare clic su textbox1 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
txtOrderNumber
Attivato
False
Nel flusso di lavoro, fare clic su textbox2 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
txtEmail
Testo
JohnDole@fabrikam.com
Nel flusso di lavoro, fare clic su textbox3 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
txtDescription
Testo
Windows 7
Nel flusso di lavoro, fare clic su textbox4 e impostare i valori seguenti nel pannello Proprietà.
Proprietà Valore Nome
txtQuantity
Testo
10
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
“”
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
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
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su Visualizza codice, quindi fare clic su Ricompila.
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.
In Rinomina, digitare Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient, quindi fare clic su OK.
Fare clic su Applica.
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
- 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
In Esplora soluzioni, fare clic con il pulsante destro del mouse su OrderClient, quindi fare clic su Imposta come progetto di avvio.
In Visual Studio, fare clic sul menu Debug, quindi su Avvia debug. Si aprirà un Windows Form.
Nel modulo, fare clic su Invia.
Aprire Esplora risorse e individuare la cartella C:\DublinTutorial\Inbox.
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderProcessingService , quindi fare clic su Pacchetto/Impostazioni di pubblicazione.
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
In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto OrderProcessingService , quindi fare clic su Crea pacchetto.
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