Compartilhar via


Apêndice A: desenvolvendo o aplicativo de ordem

Este anexo apresenta as etapas detalhadas para que os desenvolvedores criem o Serviço de pedidos do Contoso. O objetivo desse apêndice é familiarizar os desenvolvedores com o desenvolvimento de aplicativos que incluem os serviços do Windows Communication Foundation (WCF) e/ou do Windows Workflow Foundation (WF) que estão sendo usados pelo Visual Studio 1010 e .NET Framework 4. A parte principal do tutorial usa esse aplicativo para mostrar aos administradores ou aos proprietários do aplicativo como usar o Windows Server AppFabric para implantar, monitorar e solucionar problemas de aplicativos que incluem os serviços do WCF e/ou do WF.

O Serviço de pedidos do Contoso consiste nos quatro aplicativos a seguir:

  • Serviço de processo de pedidos: Um serviço de WCF que simula a chamada de um aplicativo de processamento de pedidos por meio de interfaces de serviço da Web.

  • Serviço de entrega: Um serviço de WCF que simula a chamada de um aplicativo de entrega existente por meio de APIs.

  • Serviço de fluxo de trabalho de pedidos: Um serviço de fluxo de trabalho de WF que gerencia o processo de pedidos, inclusive o recebimento, o processamento e a entrega de pedidos.

  • Cliente de pedidos: Um aplicativo do Windows Form que funciona como front-end para o Serviço de pedidos.

Dica

O Apêndice não requer que você instale o Windows Server AppFabric. Mas você deve primeiro instalar os arquivos do Tutorial usando a Interface do Windows Server AppFabric para criar a estrutura de arquivo correta para que o Anexo seja criado corretamente. Observe que não é necessário executar nem completar o Tutorial usando a Interface do Windows Server AppFabric para o Apêndice antes - basta instalar os arquivos. Para o procedimento de instalação do Tutorial usando a Interface do Windows Server AppFabric, consulte Lição 1: introdução. A pasta C:\DublinTutorial\OrderServiceSolution\Completed contém uma cópia da solução concluída.

Procedimento

Você precisará passar pelas etapas a seguir para criar o aplicativo:

  1. Desenvolvendo o Serviço WFC de processamento de pedidos

  2. Desenvolvendo o Serviço WFC de entrega

  3. Desenvolvendo o Serviço WFC de fluxo de trabalho de pedidos

  4. Finalizando o Serviço WFC de processamento de pedidos

  5. Finalizando o Serviço WFC de entrega

  6. Desenvolvendo o aplicativo do Cliente de pedidos

  7. Empacotamento do Serviço de pedidos

Desenvolvendo o Serviço WFC de processamento de pedidos

O aplicativo Processamento de pedidos foi adquirido pela Contoso. Ele vem com serviços da Web que podem se comunicar com outros aplicativos. Como um desenvolvedor da Contoso, você precisa desenvolver um serviço WFC chamado OrderProcessingService para interagir com o aplicativo de Processamento de pedidos.

Para criar uma solução do Visual Studio e um Aplicativo de Serviço WCF para o OrderProcessingService

  1. Clique em Iniciar, aponte para Todos os programas, aponte para Microsoft Visual Studio 2010 e clique em Microsoft Visual Studio 2010.

  2. A partir do menu Arquivo, clique em Novo e em Novo Projeto.

  3. Em Novo Projeto, escolha ou digite os seguintes valores e clique em OK.

    Valor da propriedade

    Tipos de projeto

    Visual C#/Web

    Modelos

    Aplicativo de Serviço WCF

    Nome

    OrderProcessingService

    Local

    C:\DublinTutorial\OrderServiceSolution

    Nome da solução

    OrderService

    Crie um diretório para a solução

    (selecionado)

  4. Em Gerenciador de Soluções, expanda OrderProcessingService, clique com o botão direito do mouse em IService1.cs e clique em Excluir.

  5. Clique em OK para confirmar a exclusão permanente do arquivo.

  6. Em Gerenciador de Soluções, expanda OrderProcessingService, clique com o botão direito do mouse em Service1.svc e clique em Excluir.

  7. Clique em OK para confirmar a exclusão permanente do arquivo.

A primeira tarefa para criar um serviço WCF é definir um contrato. O contrato especifica para quais operações o serviço oferece suporte. Uma operação pode ser considerada um método de serviço da Web. Cada método na interface corresponde a uma operação de serviço específica. No OrderProcessingService, defina os métodos ProcessOrder e CancelOrderProcess.

Para definir o contrato de serviço e de dados para o Serviço de processamento de pedidos.

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderProcessService, aponte para Adicionar e clique em Novo Item.

  2. Em Adicionar Novo Item - OrderProcessService, escolha ou digite os seguintes valores e clique em Adicionar.

    Valor da propriedade

    Categorias

    Visual C#/Web

    Modelo

    Serviço WCF

    Nome

    OrderProcessing.svc

    Dois arquivos são adicionados à solução: IOrderProcessing.cs e OrderProcessing.svc.

  3. Em Gerenciador de Soluções, clique duas vezes em IOrderProcessing.cs para abri-lo.

  4. Clique com o botão direito do mouse no namespace OrderProcessingService, clique em Refatorar e clique em Renomear para abrir a caixa de diálogo Renomear.

  5. Em Novo nome, digite Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService e clique em OK.

  6. Clique em Aplicar e clique em Sim.

  7. Modifique o código-fonte OrderProcessing.svc para que ele tenha a seguinte aparência:

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

    Nesse arquivo, defina os contratos de dados e de serviço. Os clientes podem chamar o serviço para processar um pedido e para cancelar o processamento do pedido.

Após criar os contratos, definidos por meio da utilização de uma interface, a próxima etapa será implementar a interface. Isso envolve a criação de uma classe, chamada OrderProcessService, que implementa a interface IOrderProcessing definida pelo usuário.

Para implementar o contrato do Serviço de processo de pedidos

  1. Em Gerenciador de Soluções, clique duas vezes em IOrderProcessing.cs para abri-lo.

  2. Modifique o código-fonte para que ele tenha a seguinte aparência:

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

A utilização de um arquivo de configuração proporciona a você a flexibilidade de fornecer dados de comportamento de serviço no momento da implantação e não no momento do design. Nesse arquivo de configuração, defina dois pontos de extremidade.

Para configurar o Serviço de processo de pedidos, usando o arquivo de configuração

  1. Em Gerenciador de Soluções, expanda OrderProcessingService e clique duas vezes em Web.config para abri-lo. Adicione uma marca <serviços> na marca <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>
    

Para compilar o Serviço WCF do processo de pedidos.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderProcessingService e clique em Recompilar. Verifique se o projeto foi compilado com êxito na janela Saída.

Para testar o Serviço WCF do processo de pedidos.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderProcessingService e clique em Exibir no Navegador. Uma janela do Internet Explorer será aberta, listando os arquivos do diretório.

  2. Na janela do Internet Explorer, clique em OrderProcessing.svc. Verifique se não ocorreu erros.

Desenvolvendo o Serviço WCF de entrega

Entrega é um serviço WCF, chamando do repositório do SQL Server. Na simulação, você não faz realmente uma chamada de banco de dados.

Para adicionar um novo projeto do Aplicativo de Serviço WCF à solução

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em Solução ‘OrderService’, aponte para Adicionar e clique em Novo Projeto.

  2. Em Adicionar Novo Projeto, escolha ou digite os seguintes valores e clique em OK.

    Valor da propriedade

    Tipos de projeto

    Visual C#/Web

    Modelos

    Aplicativo de Serviço WCF

    Nome

    ShippingService

    Local

    C:\DublinTutorial\OrderServiceSolution\OrderService

  3. Em Gerenciador de Soluções, expanda ShippingService, clique com o botão direito do mouse em IService1.cs e clique em Excluir.

  4. Clique em OK para confirmar a exclusão permanente do arquivo.

  5. Em Gerenciador de Soluções, expanda ShippingService, clique com o botão direito do mouse em Service1.svc e clique em Excluir.

  6. Clique em OK para confirmar a exclusão permanente do arquivo.

Defina um contrato de serviço, chamado IShipping, que contém os contratos de operação ShipOrder e CancelShipping.

Para definir o contrato do Serviço WCF de entrega

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em ShippingService, aponte para Adicionar e clique em Novo Item.

  2. Em Adicionar Novo Item - ShippingService, escolha ou digite os seguintes valores e clique em Adicionar.

    Valor da propriedade

    Categorias

    Visual C#/Web

    Modelo

    Serviço WCF

    Nome

    Shipping.svc

    Os dois arquivos adicionados ao projeto são IShipping.cs e Shipping.svc.

  3. Em Gerenciador de Soluções, clique duas vezes em IShipping.cs para abri-lo.

  4. Clique com o botão direito do mouse no namespace ShippingService, clique em Refatorar e clique em Renomear para abrir a caixa de diálogo Renomear.

  5. Em Novo nome, digite Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService e clique em OK.

  6. Clique em Aplicar e clique em Sim.

  7. Modifique o código-fonte para que ele tenha a seguinte aparência:

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

Para implementar o contrato do Serviço WCF de entrega

  1. Em Gerenciador de Soluções, clique duas vezes em Shipping.svc para abri-lo.

  2. Modifique o código-fonte para que ele tenha a seguinte aparência:

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

Nesse arquivo de configuração, defina dois pontos de extremidade.

Para configurar o Serviço WCF de entrega, usando o arquivo de configuração

  1. Em Gerenciador de Soluções, expanda ShippingService e clique duas vezes em Web.config para abri-lo. Adicione uma marca <serviços> na marca <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>
    

Para compilar o Serviço WCF de entrega

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto ShippingService e clique em Recompilar. Verifique se o projeto foi compilado com êxito na janela Saída.

Desenvolvendo o Serviço WF de fluxo de trabalho de pedidos

O aplicativo do Serviço de fluxo de trabalho de pedidos engloba a maior parte de todo o serviço. Ele coordena todo o processo corporativo. Ele recebe uma ordem de compra, chama OrderProcessingService e ShippingService e, por fim, envia ao cliente uma mensagem de e-mail sobre o status da ordem de compra.

Para adicionar um novo projeto do Aplicativo de Serviço de fluxo de trabalho WCF à solução

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em Solução ‘OrderService’, aponte para Adicionar e clique em Novo Projeto.

  2. Em Adicionar Novo Projeto, escolha ou digite os seguintes valores e clique em OK.

    Valor da propriedade

    Tipos de projeto

    Visual C#/Workflow

    Modelos

    Aplicativo de Serviço de fluxo de trabalho WCF

    Nome

    OrderWorkflowService

    Local

    C:\DublinTutorial\OrderServiceSolution\OrderService

O OrderWorkflowService consome o OrderProcessingService e o ShippingService. É preciso fazer referência aos dois serviços.

Para adicionar as referências de serviço

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderWorkflowService e clique em Adicionar Referência de Serviço.

  2. Em Adicionar Referência de Serviço, clique em Descobrir. O Visual Studio precisa descobrir ambos os serviços.

  3. Insira e selecione os seguintes valores e clique em OK para criar a referência de serviço.

    Valor da propriedade

    Serviços

    OrderProcessing.svc

    Namespace

    OrderProcessService

  4. Repita as etapas para adicionar outra referência de serviço com os valores a seguir:

    Valor da propriedade

    Serviços

    Entrega

    Namespace

    ShippingService

Defina uma atividade personalizada de fluxo de trabalho que será usada para simular o envio de notificações por email.

Para criar uma atividade de código de fluxo de trabalho

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderWorkflowService, aponte para Adicionar e clique em Novo Item.

  2. Em Adicionar Novo Item - OrderWorkflowService, escolha ou digite os seguintes valores e clique em Adicionar.

    Valor da propriedade

    Categorias

    Visual C#/Workflow

    Modelo

    Atividade de código

    Nome

    SendNotification.cs

  3. Em Gerenciador de Soluções, clique duas vezes em SendNotification.cs para abri-lo.

  4. Clique com o botão direito do mouse no namespace OrderWorkflowService, clique em Refatorar e clique em Renomear para abrir a caixa de diálogo Renomear.

  5. Em Novo nome, digite Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService e clique em OK.

  6. Clique em Aplicar e clique em Sim.

  7. Modifique o código-fonte para que ele tenha a seguinte aparência:

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

    Observe que o caminho é inserido no código para “C:\DublinTutorial\Inbox\”.

No procedimento a seguir, defina os tipos de dados. Esses tipos de dados são usados para que OrderProcessingService e ShippingService enviem resultados de volta para OrderWorkflowService.

Para definir tipos de dados

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderWorkflowService, aponte para Adicionar e clique em Novo Item.

  2. Em Adicionar Novo Item - OrderWorkflowService, escolha ou digite os seguintes valores e clique em Adicionar.

    Valor da propriedade

    Categorias

    Visual C#/Code

    Modelo

    Arquivo de código

    Nome

    DataTypes.cs

  3. Em Gerenciador de Soluções, clique duas vezes em DataTypes.cs para abri-lo.

  4. Modifique o código-fonte para que ele tenha a seguinte aparência:

    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. Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderWorkflowService e clique em Recompilar. Compile o projeto para que a atividade de código fique acessível a partir do fluxo de trabalho que você desenvolverá na etapa a seguir. A compilação também pode expor os pontos de extremidade mencionados do serviço WCF ao fluxo de trabalho.

A próxima etapa será definir o fluxo de trabalho. O fluxo de trabalho contém diversos estados. Comece com a definição dos estados e depois defina os detalhes dos estados. Cada parte do desenvolvimento pode conter as etapas a seguir:

  1. Componha o fluxo de trabalho por meio de atividades.

  2. Defina variáveis.

  3. Configure as atividades.

Para definir o fluxo de trabalho

  1. Em Gerenciador de Soluções, expanda OrderWorkflowService, clique com o botão direito do mouse em Service1.xamlx e clique em Renomear. Renomeie o arquivo para OrderWorkflow.xamlx.

  2. Em Gerenciador de Soluções, clique duas vezes em OrderWorkflow.xamlx para abri-lo. Há duas atividades listadas no Serviço Sequencial: uma é chamada de ReceiveRequest e a outra de SendResponse.

  3. Clique com o botão direito do mouse na atividade Serviço Sequencial e clique em Excluir.

  4. A partir do fluxo de trabalho, clique em Soltar atividade aqui e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    configurationName

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

    Nome

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

  5. Clique em Caixa de Ferramentas, do lado esquerdo da janela, para abrir o painel Caixa de Ferramentas, e fixe-o do lado esquerdo da janela.

  6. A partir da Caixa de Ferramentas, arraste as seguintes atividades para o fluxo de trabalho que diz “Soltar atividade aqui”.

    Categoria Atividade Observação

    Fluxograma

    Fluxograma

    A atividade Fluxograma é uma atividade composta que contém uma Inicialização por padrão. Você adicionará mais atividades à ela nas etapas a seguir.

  7. A partir da Caixa de Ferramentas, arraste as seguintes atividades até o fluxo de trabalho mostrado:

    Categoria Atividade Observação

    Sistema de mensagens

    ReceiveAndSendReply

    Esse é o estado “Aguardar pedidos”.

    Fluxo de controle

    Sequência

    Conterá o segundo estado, denominado “Pedido aberto”.

    Fluxograma

    FlowDecision

    A atividade FlowDecision auxilia na transição entre estados.

    Fluxo de controle

    Sequência

    Conterá o terceiro estado, denominado “Pedido processado”.

    Fluxograma

    FlowDecision

    A atividade FlowDecision auxilia na transição entre estados.

    Fluxo de controle

    Sequência

    Conterá o último estado, denominado “Pedido concluído”.

  8. Use o ponteiro do mouse a fim de conectar as atividades para que elas tenham a seguinte aparência:

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

  9. Clique em Variáveis na parte inferior do fluxo de trabalho para abrir o painel Variáveis.

  10. No painel Variáveis, clique em Criar Variável e crie as variáveis a seguir:

    Nome da variável Tipo de variável Escopo Observação

    poID

    Cadeia de caracteres

    Fluxograma

    O poID é um número GUID e também pode ser usado para correlação.

    isProcessed

    Booleano

    Fluxograma

    É um sinalizador que indica se um pedido foi processado com êxito.

    isShipped

    Booleano

    Fluxograma

    É um sinalizador que indica se um pedido foi entregue.

    isUpdated

    Booleano

    Fluxograma

    É um sinalizador que indica se um pedido foi atualizado pelo cliente.

    po

    PurchaseOrder

    Fluxograma

    É um tipo personalizado de dados, definido no OrderProcessingService. Ele contém as informações sobre o PO.

    poUpdate

    PurchaseOrder

    Fluxograma

    Contém as informações atualizadas sobre o PO quando um cliente desejar atualizar o PO.

    correlationorderWorkflow

    CorrelationHandle

    Fluxograma

    É o identificador de correlação usado para conectar o cliente ao serviço e também para conectar o serviço ao OrderProcessService e ao ShippingService.

    Esta é uma captura de tela das variáveis criadas:

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

  11. A partir do fluxo de trabalho, clique na atividade Fluxograma e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Serviço de pedidos

  12. A partir do fluxo de trabalho, clique na primeira atividade Sequência e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Aguardar pedidos

  13. A partir do fluxo de trabalho, clique na segunda atividade Sequência e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Pedido aberto

  14. A partir do fluxo de trabalho, clique na terceira atividade Sequência e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Pedido processado

  15. A partir do fluxo de trabalho, clique na quarta atividade Sequência e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Pedido concluído

  16. A partir do fluxo de trabalho, clique na primeira atividade FlowDecision e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Condição

    isProcessed

    FalseLabel

    Atualizado

    TrueLabel

    Processado

  17. A partir do fluxo de trabalho, clique na segunda atividade FlowDecision e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Condição

    isShipped

    FalseLabel

    Atualizado

    TrueLabel

    Entregue

    Você definiu a estrutura principal do fluxo de trabalho de máquina de estado. Agora você definirá cada estado individualmente.

  18. A partir do fluxo de trabalho, clique duas vezes em Aguardar pedidos. Observe que o caminho é mostrado abaixo da guia. Você pode clicar em Serviço de pedidos para voltar à página onde todo o fluxo de trabalho de máquina de estado é exibido.

  19. A partir da Caixa de Ferramentas, arraste as seguintes atividades até o fluxo de trabalho para mostrar:

    Categoria Atividade Observação

    Primitivos

    Atribuir

    A atividade Atribuir dá ao pedido um ID do pedido (GUID).

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowSerivce

    SendNotification

    Essa atividade personalizada envia ao cliente uma notificação por email.

    Primitivos

    Atribuir

    A atividade Atribuir é utilizada para que o produto da ordem de compra possa ser monitorado.

    Primitivos

    Atribuir

    A atividade Atribuir é utilizada para que a quantidade da ordem de compra possa ser monitorada.

  20. Reorganize as atividades para que elas tenham a seguinte aparência:

    Aguardar pelas atividades de estado do pedido

  21. Clique em Variáveis na parte inferior do fluxo de trabalho para abrir o painel Variáveis.

  22. No painel Variáveis, clique em Criar Variável e crie as variáveis a seguir:

    Nome da variável Tipo de variável Escopo Observação

    produto

    Cadeia de caracteres

    Aguardar pedidos

    AppFabric é capaz de acompanhar as variáveis de fluxo de trabalho. Essa variável é criada para que o nome do produto possa ser rastreado.

    quantidade

    Int32

    Aguardar pedidos

    Essa variável tem a finalidade de rastreamento.

  23. A partir do fluxo de trabalho, clique na atividade Receber e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem: po; Tipo de mensagem: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.Purchaseorder

    DisplayName

    Receber PO

    OperationName

    SubmitPO

    SerivceContractName

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

    CanCreateInstance

    (selecionado)

  24. A partir do fluxo de trabalho, clique na primeira atividade Atribuir e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Atribuir ID do PO

    A

    po.POID

    Valor

    System.Guid.NewGuid().ToString()

  25. A partir do fluxo de trabalho, clique na atividade SendReplyToReceive e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem: po.POID; Tipo de mensagem: cadeia de caracteres

    CorrelationInitializers

    CorrelationOrderWorkflow;Consultar inicialização de correlação; key1=sm:body()/xg0:string

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

    Dica

    O que você acabou de fazer é chamado de correlação. Esse fluxo de trabalho possui sete atividades de recebimento: uma recebendo a ordem de compra, uma recebendo o resultado de serviço do processo, uma recebendo o resultado de serviço da entrega, duas recebendo atualizações do cliente e duas recebendo cancelamentos do cliente. Após receber a ordem de compra, o serviço de fluxo de trabalho gera um número GUID como o número do pedido. Suponha que o serviço de fluxo de trabalho receba muitas ordens de compra ao mesmo tempo. O mecanismo de fluxo de trabalho cria uma instância de fluxo de trabalho para cada solicitação de ordem de compra. O mecanismo de fluxo de trabalho precisa atender (ou correlacionar-se) às outras seis solicitações para as instâncias de fluxo de trabalho. Para isso, o mecanismo de fluxo de trabalho precisa de um único identificador para cada correlação. Nesse exemplo, o único identificador é o número do pedido (GUID). Na primeira atividade SendReplyToReceive, defina um CorrelationInitializer. Escolha o tipo de consulta Inicializador de Correlação de Consulta, que significa que o único identificador está na mensagem que é passada para a atividade de recebimento. Especifique também o xPath para o campo. Além do Inicializador de Correlação, especifique também um Identificador de Correlação no campo CorrelateWith. Um Identificador de Correlação é um contêiner para os dados de correlação, de modo que os dados de correlação sejam recuperados em qualquer parte do fluxo de trabalho. Nos recebimentos subsequentes, especifique o mesmo Identificador de Correlação. Nos campos CorrelateOn, especifique como recuperar o número do pedido a partir da mensagem recebida.

  26. A partir do fluxo de trabalho, clique na atividade SendNotification e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress

  27. A partir do fluxo de trabalho, clique na segunda atividade Atribuir e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Atribuir nome do produto

    A

    produto

    Valor

    po.Description

  28. A partir do fluxo de trabalho, clique na terceira atividade Atribuir e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Atribuir quantidade

    A

    quantidade

    valor

    po.Quantity

    Você terminou de implementar o estado Aguardar pedidos.

  29. Abaixo do nome da guia, clique em Serviço de pedidos para exibir a atividade Fluxograma "Serviço de pedidos".

  30. A partir do fluxo de trabalho, clique duas vezes na atividade Sequência Pedido aberto para implementar o estado.

  31. A partir da Caixa de Ferramentas, arraste as seguintes atividades até o fluxo de trabalho para mostrar:

    Categoria Atividade Observação

    Primitivos

    Atribuir

    Fluxo de controle

    Paralelo

  32. Arraste a seguinte atividade para a atividade Paralelo:

    Categoria Atividade Observação

    Fluxo de controle

    Sequência

  33. Arraste a seguinte atividade para a atividade Sequência:

    Categoria Atividade Observação

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

    ProcessOrder

    Tempo de execução

    Persistir

    Sistema de mensagens

    Receber

    Microsoft.Samples.Dublin.Tutorials.OrderService.orderWorkflowService

    SendNotification

    Primitivos

    Atribuir

  34. Arraste a seguinte atividade para a atividade Paralelo e para o lado direito da atividade existente Sequência:

    Categoria Atividade Observação

    Sistema de mensagens

    ReceiveAndSendReply

    A atividade ReceiveAndSendReply é uma atividade composta com uma atividade Sequência que engloba uma atividade Receber e uma atividade SendReplyToReceive.

  35. Arraste as seguinte atividades para a atividade Sequência recém adicionada e para baixo das atividades Receive e SendReplyToReceive.

    Categoria Atividade Observação

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

    CancelOrderProcess

    Fluxo de controle

    If

  36. Arraste a seguinte atividade para a ramificação Portanto da atividade Se:

    Categoria Atividade Observação

    Fluxo de controle

    Sequência

  37. Arraste as seguintes atividades para a atividade Sequência recém adicionada:

    Categoria Atividade Observação

    Primitivos

    Atribuir

    Primitivos

    Atribuir

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

  38. Arraste a seguinte atividade para a ramificação Exceto da atividade Se:

    Categoria Atividade Observação

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

  39. Arraste a seguinte atividade para a atividade Paralelo para torná-la a ramificação mais à direita

    Categoria Atividade Observação

    Sistema de mensagens

    ReceiveAndSendReply

  40. Arraste as seguinte atividades para a atividade Sequência recém adicionada e para baixo das atividades Receive e SendReplyToReceive.

    Categoria Atividade Observação

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

    CancelOrderProcess

    Fluxo de controle

    If

  41. Arraste a seguinte atividade para a ramificação Portanto da atividade Se:

    Categoria Atividade Observação

    Fluxo de controle

    Sequência

  42. Arraste as seguintes atividades para a atividade Sequência recém adicionada:

    Categoria Atividade Observação

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    Tempo de execução

    TerminateWorkflow

  43. Arraste a seguinte atividade para a ramificação Exceto da atividade Se:

    Categoria Atividade Observação

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    O estado Pedido Aberto terá a seguinte aparência após a adição das atividades:

    Estado aberto do pedido

  44. Clique na atividade Sequência, na ramificação mais à esquerda da atividade paralelo, e clique em Variáveis, na parte inferior do fluxo de trabalho, para abrir o painel Variáveis.

  45. No painel Variáveis, clique em Criar Variável e crie as seguintes variáveis:

    Nome da variável Tipo de variável Escopo Observação

    cancelOrderProcessAcknowledgement

    Cadeia de caracteres

    Paralelo

    ProcessServiceResult

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

    Sequência

    processServiceAcknowledgement

    Cadeia de caracteres

    Sequência

  46. A partir do fluxo de trabalho, clique na atividade Atribuir, na parte superior da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Inicializar isUpdated

    A

    isUpdated

    Valor

    Falso

  47. A partir do fluxo de trabalho, clique na atividade Paralelo e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conclusão

    isUpdated Or isProcessed

    DisplayName

    Processar pedido

  48. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Processamento

  49. A partir do fluxo de trabalho, clique na atividade ProcessOrder, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Processar pedido

    po

    po

    ProcessOrderResult

    processServiceAcknowledgement

  50. A partir do fluxo de trabalho, clique na atividade Receber, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem:processServiceResult; Tipo de mensagem: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ProcessServiceResult

    DisplayName

    Receber resultado de processo

    OperationName

    SubmitProcessResult

    ServiceContractName

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

    CanCreateInstance

    (Limpar)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  51. A partir do fluxo de trabalho, clique na atividade SendNotification, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress
  52. A partir do fluxo de trabalho, clique na atividade Atribuir, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Definir o sinalizador isProcessed

    A

    isProcessed

    Valor

    True

    Você terminou de configurar a ramificação mais à esquerda da atividade Paralelo.

  53. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Aguardando atualização

  54. A partir do fluxo de trabalho, clique na atividade Receber, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem:poUpdate; Tipo de mensagem: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Receber atualização

    OperationName

    SubmitUpdate

    ServiceContractName

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

    CanCreateInstance

    (Limpar)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  55. A partir do fluxo de trabalho, clique na atividade SendReplyToReceive, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem: “Atualização do PO recebida”; Tipo de mensagem: Cadeia de caracteres

    DisplayName

    Reconhecer recebimento de atualização

  56. A partir do fluxo de trabalho, clique na atividade CancelOrderProcess, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Cancelar processamento de pedidos

    orderID

    po.POID
  57. A partir do fluxo de trabalho, clique na atividade Se, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Condição

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

    DisplayName

    Verificar o status de cancelamento

  58. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    O cancelamento substituiu a sequência

  59. A partir do fluxo de trabalho, clique na primeira atividade Atribuir, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Atualizar PO

    A

    po

    Valor

    poUpdate
  60. A partir do fluxo de trabalho, clique na segunda atividade Atribuir, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Defina o sinalizador isUpdated

    A

    isUpdated

    Valor

    True
  61. A partir do fluxo de trabalho, clique na atividade SendNotification, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress
  62. A partir do fluxo de trabalho, clique na atividade SendNotification, na ramificação Exceto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress

    Você terminou de configurar a ramificação central da atividade Paralelo.

  63. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Aguardando o cancelamento

  64. A partir do fluxo de trabalho, clique na atividade Receber, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem:poID; Tipo de mensagem:

    DisplayName

    Receber cancelamento

    OperationName

    SubmitCancellation

    ServiceContractName

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

    CanCreateInstance

    (Limpar)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  65. A partir do fluxo de trabalho, clique na atividade SendReplyToReceive, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem: “Cancelamento do PO recebido”; Tipo de mensagem: Cadeia de caracteres

    DisplayName

    Reconhecer recebimento de cancelamento

  66. A partir do fluxo de trabalho, clique na atividade CancelOrderProcess, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Cancelar processamento de pedidos

    orderID

    po.POID
  67. A partir do fluxo de trabalho, clique na atividade Se, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Condição

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

    DisplayName

    Verificar o status de cancelamento

  68. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    O cancelamento substituiu a sequência

  69. A partir do fluxo de trabalho, clique na atividade SendNotification, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

    "Your order has been cancelled upon your request."

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress
  70. A partir do fluxo de trabalho, clique na atividade TerminateWorkflow, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Concluir fluxo de trabalho

    Razão

    “Client cancellation”
  71. A partir do fluxo de trabalho, clique na segunda atividade SendNotification, na ramificação Exceto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress

    Você terminou de configurar a ramificação mais à direita da atividade Paralelo.

  72. Abaixo do nome da guia, clique em Serviço de pedidos para exibir a atividade Fluxograma "Serviço de pedidos".

  73. A partir do fluxo de trabalho, clique duas vezes na atividade Sequência Pedido processado para implementar o estado.

  74. A partir da Caixa de Ferramentas, arraste as seguintes atividades até o fluxo de trabalho para mostrar:

    Categoria Atividade Observação

    Primitivos

    Atribuir

    Fluxo de controle

    Paralelo

  75. Arraste a seguinte atividade para a atividade Paralelo:

    Categoria Atividade Observação

    Fluxo de controle

    Sequência

  76. Arraste a seguinte atividade para a atividade Sequência:

    Categoria Atividade Observação

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

    ShipOrder

    Tempo de execução

    Persistir

    Sistema de mensagens

    Receber

    Primitivos

    Atribuir

  77. Arraste a seguinte atividade para a atividade Paralelo e para o lado direito da atividade existente Sequência:

    Categoria Atividade Observação

    Sistema de mensagens

    ReceiveAndSendReply

    A atividade ReceiveAndSendReply é uma atividade composta com uma atividade Sequência que engloba uma atividade Receber e uma atividade SendReplyToReceive.

  78. Arraste as seguinte atividades para a atividade Sequência recém adicionada e para baixo das atividades Receive e SendReplyToReceive.

    Categoria Atividade Observação

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

    CancelShipping

    Fluxo de controle

    If

  79. Arraste a seguinte atividade para a ramificação Portanto da atividade Se:

    Categoria Atividade Observação

    Fluxo de controle

    Sequência

  80. Arraste as seguintes atividades para a atividade Sequência recém adicionada:

    Categoria Atividade Observação

    Primitivos

    Atribuir

    Primitivos

    Atribuir

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  81. Arraste a seguinte atividade para a ramificação Exceto da atividade Se:

    Categoria Atividade Observação

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  82. Arraste a seguinte atividade para a atividade Paralelo para torná-la a ramificação mais à direita

    Categoria Atividade Observação

    Sistema de mensagens

    ReceiveAndSendReply

  83. Arraste as seguinte atividades para a atividade Sequência recém adicionada e para baixo das atividades Receive e SendReplyToReceive.

    Categoria Atividade Observação

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

    CancelShipping

    Fluxo de controle

    If

  84. Arraste a seguinte atividade para a ramificação Portanto da atividade Se:

    Categoria Atividade Observação

    Fluxo de controle

    Sequência

  85. Arraste as seguintes atividades para a atividade Sequência recém adicionada:

    Categoria Atividade Observação

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Tempo de execução

    TerminateWorkflow

  86. Arraste a seguinte atividade para a ramificação Exceto da atividade Se:

    Categoria Atividade Observação

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SenNotification

    O estado Pedido Processado terá a seguinte aparência após a adição das atividades:

    Estado processado do pedido

  87. Clique na atividade Sequência, na ramificação mais à esquerda da atividade paralelo, e clique em Variáveis, na parte inferior do fluxo de trabalho, para abrir o painel Variáveis.

  88. No painel Variáveis, clique em Criar Variável e crie as variáveis a seguir:

    Nome da variável Tipo de variável Escopo Observação

    cancelShippingAcknowledgement

    Cadeia de caracteres

    Paralelo

    ShippingServiceResult

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

    Sequência

    shippingServiceAcknowledgement

    Cadeia de caracteres

    Sequência

  89. A partir do fluxo de trabalho, clique na atividade Atribuir, na parte superior da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Inicializar isUpdated

    A

    isUpdated

    Valor

    False

  90. A partir do fluxo de trabalho, clique na atividade Paralelo e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conclusão

    isUpdated Or isShipped

    DisplayName

    Entregar pedido

  91. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Entrega

  92. A partir do fluxo de trabalho, clique na atividade ShipOrder, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Entregar pedido

    poID

    po.POID

    ShipOrderResult

    shippingServiceAcknowledgement

  93. A partir do fluxo de trabalho, clique na atividade Receber, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem:shippingServiceResult; Tipo de mensagem: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ShippingServiceResult

    DisplayName

    Receber resultado da entrega

    OperationName

    SubmitShippingResult

    ServiceContractName

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

    CanCreateInstance

    (Limpar)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  94. A partir do fluxo de trabalho, clique na atividade Atribuir, na ramificação mais à esquerda da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Defina o sinalizador isShipped

    A

    isShipped

    Valor

    True

    Você terminou de configurar a ramificação mais à esquerda da atividade Paralelo.

  95. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Aguardando atualização

  96. A partir do fluxo de trabalho, clique na atividade Receber, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem:poUpdate; Tipo de mensagem: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Receber atualização

    OperationName

    SubmitUpdate

    ServiceContractName

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

    CanCreateInstance

    (Limpar)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  97. A partir do fluxo de trabalho, clique na atividade SendReplyToReceive, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem: “Atualização do PO recebida”; Tipo de mensagem: Cadeia de caracteres

    DisplayName

    Reconhecer recebimento de atualização

  98. A partir do fluxo de trabalho, clique na atividade CancelShipping, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    CancelShippingResult

    cancelShippingAcknowledgement

    DisplayName

    Cancelar entrega

    orderID

    poUpdate.POID
  99. A partir do fluxo de trabalho, clique na atividade Se, na ramificação central da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Condição

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

    DisplayName

    Verificar o status de cancelamento

  100. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    O cancelamento substituiu a sequência

  101. A partir do fluxo de trabalho, clique na primeira atividade Atribuir, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Atualizar PO

    A

    po

    Valor

    poUpdate
  102. A partir do fluxo de trabalho, clique na segunda atividade Atribuir, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Defina o sinalizador isUpdated

    A

    isUpdated

    Valor

    True
  103. A partir do fluxo de trabalho, clique na atividade SendNotification, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress
  104. A partir do fluxo de trabalho, clique na atividade SendNotification, na ramificação Exceto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress

    Você terminou de configurar a ramificação central da atividade Paralelo.

  105. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Aguardando o cancelamento

  106. A partir do fluxo de trabalho, clique na atividade Receber, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem:poID; Tipo de mensagem:

    DisplayName

    Receber cancelamento

    OperationName

    SubmitCancellation

    ServiceContractName

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

    CanCreateInstance

    (Limpar)

    CorrelationOn

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

    CorrelationWith

    correlationOrderWorkflow

  107. A partir do fluxo de trabalho, clique na atividade SendReplyToReceive, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Conteúdo

    Mensagem; Dados da mensagem: “Cancelamento do PO recebido”; Tipo de mensagem: Cadeia de caracteres

    DisplayName

    Reconhecer recebimento de cancelamento

  108. A partir do fluxo de trabalho, clique na atividade CancelShipping, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    CancelshippingResult

    cancelShippingAcknowledgement

    DisplayName

    Cancelar entrega

    poID

    po.POID
  109. A partir do fluxo de trabalho, clique na atividade Se, na ramificação mais à direita da atividade Paralelo, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Condição

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

    DisplayName

    Verificar o status de cancelamento

  110. A partir do fluxo de trabalho, clique na atividade Sequência, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    O cancelamento substituiu a sequência

  111. A partir do fluxo de trabalho, clique na atividade SendNotification, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    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

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress
  112. A partir do fluxo de trabalho, clique na atividade TerminateWorkflow, na ramificação Portanto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    DisplayName

    Concluir fluxo de trabalho

    Razão

    “Client cancellation”
  113. A partir do fluxo de trabalho, clique na segunda atividade SendNotification, na ramificação Exceto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress

    Você terminou de configurar a ramificação mais à direita da atividade Paralelo.

  114. Abaixo do nome da guia, clique em Serviço de pedidos para exibir a atividade Fluxograma "Serviço de pedidos".

  115. A partir do fluxo de trabalho, clique duas vezes na atividade Sequência Pedido concluído para implementar o estado.

  116. A partir da Caixa de Ferramentas, arraste as seguintes atividades até o fluxo de trabalho, conforme mostrado:

    Categoria Atividade Observação

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  117. A partir do fluxo de trabalho, clique na segunda atividade SendNotification, na ramificação Exceto da atividade Se, e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Corpo

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

    DisplayName

    Enviar notificação ao cliente

    Assunto

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

    A

    po.EmailAddress

    Você terminou o desenvolvimento do fluxo de trabalho.

Nesse arquivo de configuração, defina dois pontos de extremidade e um elemento de comportamento.

Para configurar o Serviço de fluxo de trabalho de pedidos, usando o arquivo de configuração

  1. Em Gerenciador de Soluções, expanda OrderWorkflowService e clique duas vezes em Web.config para abri-lo.

  2. Adicione uma marca <serviços> na marca <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>
    

Para compilar o Serviço de fluxo de trabalho de pedidos

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderWorkflowService e clique em Recompilar. Verifique se o projeto foi compilado com êxito na janela Saída.

Finalizando o Serviço de processamento de pedidos

O OrderProcessingService e o OrderWorkflowService fazem referência um ao outro. Desse modo, você precisa concluir o OrderProcessingService após concluir o OrderWorkflowService.

Para adicionar as referências de serviço

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderProcessingService e clique em Adicionar Referência de Serviço.

  2. Em Adicionar Referência de Serviço, clique em Descobrir. O Visual Studio precisa descobrir ambos os serviços.

  3. Insira e selecione os seguintes valores e clique em OK para criar a referência de serviço.

    Valor da propriedade

    Serviços

    OrderWorkflow.xamlx

    Namespace

    OrderWorkflowService

Para modificar o OrderProcess.svc

  1. Em Gerenciador de Soluções, expanda OrderProcessingService e clique duas vezes em OrderProcessing.svc para abri-lo.

  2. Remova os comentários da seção da função SendProcessResult para que ela tenha a seguinte aparência:

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

Para compilar o Serviço de processamento de pedidos

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderProcessingService e clique em Recompilar. Verifique se o projeto foi compilado com êxito na janela Saída.

Finalizando o Serviço de entrega

O ShippingService e o OrderWorkflowService fazem referência um ao outro. Desse modo, você precisa concluir o ShipingService após concluir o OrderWorkflowService.

Para adicionar as referências de serviço

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em ShippingService e clique em Adicionar Referência de Serviço.

  2. Em Adicionar Referência de Serviço, clique em Descobrir. O Visual Studio precisa descobrir ambos os serviços.

  3. Insira e selecione os seguintes valores e clique em OK para criar a referência de serviço.

    Valor da propriedade

    Serviços

    OrderWorkflow.xamlx

    Namespace

    OrderWorkflowService

Para modificar o Shipping.svc

  1. Em Gerenciador de Soluções, expanda ShippingService e clique duas vezes em Shipping.svc para abri-lo.

  2. Remova os comentários da seção da função SendShippingResult para que ela tenha a seguinte aparência:

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

Para compilar o Serviço de entrega

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto ShippingService e clique em Recompilar. Verifique se o projeto foi compilado com êxito na janela Saída.

Desenvolvendo o Aplicativo do cliente de pedidos

Nessa etapa, você desenvolverá um aplicativo do cliente do Windows Form.

Para adicionar um projeto do aplicativo do Windows Form à solução

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse em Solução ‘OrderService’, aponte para Adicionar e clique em Novo Projeto.

  2. Em Adicionar Novo Projeto, escolha ou digite os seguintes valores e clique em OK.

    Valor da propriedade

    Tipos de projeto

    Visual C#/Windows

    Modelos

    Aplicativo do Windows Forms

    Nome

    OrderClient

    Local

    C:\DublinTutorial\OrderServiceSolution\OrderService

O cliente do Pedido é uma interface para o serviço de fluxo de trabalho. É preciso adicionar uma referência de serviço ao serviço de fluxo de trabalho.

Para adicionar a referência de serviço

  1. Em Gerenciador de soluções, clique com o botão direito do mouse emOrderClient e clique Adicionar Referência de Serviço para abrir a caixa de diálogo Adicionar Referência de Serviço.

  2. Em Adicionar Referência de Serviço, clique em Descobrir.

  3. Insira e selecione os seguintes valores e clique em OK para criar a referência de serviço.

    Valor da propriedade

    Serviços

    OrderWorkflow.xamlx

    Namespace

    OrderWorkflowService

Para desenvolver o Windows Form

  1. Em Gerenciador de Soluções, expanda OrderClient e clique duas vezes em Form1.cs para abri-lo.

  2. Clique com o botão direito do mouse em Form1.cs, clique em Renomear e digite OrderForm.cs.

  3. No prompt, clique em Sim.

  4. A partir da Caixa de Ferramentas, adicione quatro controles Rótulo, cinco controles TextBox e três controles Botão ao formulário e alinhe os controles para que eles tenham a mesma aparência da captura de tela a seguir:

  5. A partir do fluxo de trabalho, clique no formulário e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    OrderForm

    Texto

    Formulário do pedido da Contoso.com

  6. A partir do fluxo de trabalho, clique em label1 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    lblOrderNumber

    Texto

    Número do pedido:

  7. A partir do fluxo de trabalho, clique em label2 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    lblEmail

    Texto

    Email:

  8. A partir do fluxo de trabalho, clique em label3 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    lblDescription

    Texto

    Descrição:

  9. A partir do fluxo de trabalho, clique em label4 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    lblQuantity

    Texto

    Quantidade:

  10. A partir do fluxo de trabalho, clique em textbox1 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    txtOrderNumber

    Habilitada

    False

  11. A partir do fluxo de trabalho, clique em textbox2 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    txtEmail

    Texto

    JohnDole@fabrikam.com

  12. A partir do fluxo de trabalho, clique em textbox3 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    txtDescription

    Texto

    Windows 7

  13. A partir do fluxo de trabalho, clique em textbox4 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    txtQuantity

    Texto

    10

  14. A partir do fluxo de trabalho, clique em textbox5 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    txtStatus

    Âncora

    Inferior, esquerdo, direito

    Habilitada

    False

    Texto

    “”

  15. A partir do fluxo de trabalho, clique em button1 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    btnSubmit

    Âncora

    Inferior, direito

    Texto

    Enviar

    Clique em (abaixo da guia Evento)

    btnSubmit_Click

  16. A partir do fluxo de trabalho, clique em button2 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    btnUpdate

    Âncora

    Inferior, direito

    Texto

    Atualizar

    Clique em (abaixo da guia Evento)

    btnUpdate_Click

  17. A partir do fluxo de trabalho, clique em button3 e defina os seguintes valores no painel Propriedades.

    Valor da propriedade

    Nome

    btnCancel

    Âncora

    Inferior, direito

    Texto

    Cancelar

    Clique em (abaixo da guia Evento)

    btnCancel_Click

  18. Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderForm.cs e clique em Exibir Código.

  19. Clique com o botão direito do mouse no namespace OrderClient, clique em Refatorar e clique em Renomear para abrir a caixa de diálogo Renomear.

  20. Em Renomear, digite Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient e clique em OK.

  21. Clique em Aplicar.

  22. Substitua o código com o seguinte:

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

Para compilar o cliente do Pedido

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderClient e clique em Recompilar. Verifique se o projeto foi compilado com êxito na janela Saída.

Testando o Serviço de pedidos

Para testar o Serviço de pedidos

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em OrderClient e clique em Definir como Projeto de Início.

  2. A partir do Visual Studio, clique no menu Depurar e clique em Iniciar Depuração. Você verá um Windows Form aberto.

  3. A partir do formulário, clique em Enviar.

  4. Abra Windows Explorer e navegue até a pasta C:\DublinTutorial\Inbox.

  5. Aguarde até ver todas as três notificações por email. Leva entre três e quatro minutos para ver todos os três arquivos.

Remessa do Serviço de pedidos

Para fazer a remessa do serviço OrderProcessingService WCF

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderProcessingService e clique em Fazer Remessa/Publicar Configurações.

  2. Digite os seguintes valores:

    Valor da propriedade

    Crie uma remessa da Web como um arquivo ZIP

    (selecionado)

    O local é onde a remessa será criada

    C:\DublinTutorial\DeploymentPackages\OrderProcessingService.zip

    Nome do Aplicativo/Site IIS a ser usado no servidor de destino

    OrderService/OrderProcessingService

  3. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderProcessingService e clique em Criar Remessa.

  4. Repita o último procedimento para criar remessas para os outros três projetos com as seguintes configurações:

    Nome do projeto O local é onde a remessa será criada Nome do Aplicativo/Site IIS a ser usado no servidor de destino

    OrderWorkflowService

    C:\DublinTutorial\DeploymentPackages\OrderWorkflowService.zip

    OrderService/OrderWorkflowService

    ShippingService

    C:\DublinTutorial\DeploymentPackages\ShippingService.zip

    OrderService/ShippingService

    Dica

    Atualize os endereços do ponto de extremidade dos serviços dependentes em arquivos Web.config para refletir o servidor onde as remessas serão implantadas antes da remessa de um serviço ser feita.

Consulte também

Conceitos

Tutorial usando a interface do Windows Server AppFabric
Tutorial com o Windows PowerShell

  2011-12-05