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:
Desenvolvendo o Serviço WFC de processamento de pedidos
Desenvolvendo o Serviço WFC de entrega
Desenvolvendo o Serviço WFC de fluxo de trabalho de pedidos
Finalizando o Serviço WFC de processamento de pedidos
Finalizando o Serviço WFC de entrega
Desenvolvendo o aplicativo do Cliente de pedidos
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
Clique em Iniciar, aponte para Todos os programas, aponte para Microsoft Visual Studio 2010 e clique em Microsoft Visual Studio 2010.
A partir do menu Arquivo, clique em Novo e em Novo Projeto.
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)
Em Gerenciador de Soluções, expanda OrderProcessingService, clique com o botão direito do mouse em IService1.cs e clique em Excluir.
Clique em OK para confirmar a exclusão permanente do arquivo.
Em Gerenciador de Soluções, expanda OrderProcessingService, clique com o botão direito do mouse em Service1.svc e clique em Excluir.
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.
Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderProcessService, aponte para Adicionar e clique em Novo Item.
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.
Em Gerenciador de Soluções, clique duas vezes em IOrderProcessing.cs para abri-lo.
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.
Em Novo nome, digite Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService e clique em OK.
Clique em Aplicar e clique em Sim.
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
Em Gerenciador de Soluções, clique duas vezes em IOrderProcessing.cs para abri-lo.
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
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.
- 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.
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.
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
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.
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
Em Gerenciador de Soluções, expanda ShippingService, clique com o botão direito do mouse em IService1.cs e clique em Excluir.
Clique em OK para confirmar a exclusão permanente do arquivo.
Em Gerenciador de Soluções, expanda ShippingService, clique com o botão direito do mouse em Service1.svc e clique em Excluir.
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
Em Gerenciador de Soluções, clique com o botão direito do mouse em ShippingService, aponte para Adicionar e clique em Novo Item.
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.
Em Gerenciador de Soluções, clique duas vezes em IShipping.cs para abri-lo.
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.
Em Novo nome, digite Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService e clique em OK.
Clique em Aplicar e clique em Sim.
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
Em Gerenciador de Soluções, clique duas vezes em Shipping.svc para abri-lo.
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
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
- 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
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.
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
Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderWorkflowService e clique em Adicionar Referência de Serviço.
Em Adicionar Referência de Serviço, clique em Descobrir. O Visual Studio precisa descobrir ambos os serviços.
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
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
Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderWorkflowService, aponte para Adicionar e clique em Novo Item.
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
Em Gerenciador de Soluções, clique duas vezes em SendNotification.cs para abri-lo.
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.
Em Novo nome, digite Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService e clique em OK.
Clique em Aplicar e clique em Sim.
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
Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderWorkflowService, aponte para Adicionar e clique em Novo Item.
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
Em Gerenciador de Soluções, clique duas vezes em DataTypes.cs para abri-lo.
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; } }
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:
Componha o fluxo de trabalho por meio de atividades.
Defina variáveis.
Configure as atividades.
Para definir o fluxo de trabalho
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.
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.
Clique com o botão direito do mouse na atividade Serviço Sequencial e clique em Excluir.
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
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.
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.
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”.
Use o ponteiro do mouse a fim de conectar as atividades para que elas tenham a seguinte aparência:
Clique em Variáveis na parte inferior do fluxo de trabalho para abrir o painel Variáveis.
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:
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
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
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
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
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
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
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.
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.
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.
Reorganize as atividades para que elas tenham a seguinte aparência:
Clique em Variáveis na parte inferior do fluxo de trabalho para abrir o painel Variáveis.
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.
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)
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()
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
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.
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
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
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.
Abaixo do nome da guia, clique em Serviço de pedidos para exibir a atividade Fluxograma "Serviço de pedidos".
A partir do fluxo de trabalho, clique duas vezes na atividade Sequência Pedido aberto para implementar o estado.
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
Arraste a seguinte atividade para a atividade Paralelo:
Categoria Atividade Observação Fluxo de controle
Sequência
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
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.
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
Arraste a seguinte atividade para a ramificação Portanto da atividade Se:
Categoria Atividade Observação Fluxo de controle
Sequência
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
Arraste a seguinte atividade para a ramificação Exceto da atividade Se:
Categoria Atividade Observação Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SenNotification
Arraste a seguinte atividade para a atividade Paralelo para torná-la a ramificação mais à direita
Categoria Atividade Observação Sistema de mensagens
ReceiveAndSendReply
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
Arraste a seguinte atividade para a ramificação Portanto da atividade Se:
Categoria Atividade Observação Fluxo de controle
Sequência
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
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:
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.
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Abaixo do nome da guia, clique em Serviço de pedidos para exibir a atividade Fluxograma "Serviço de pedidos".
A partir do fluxo de trabalho, clique duas vezes na atividade Sequência Pedido processado para implementar o estado.
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
Arraste a seguinte atividade para a atividade Paralelo:
Categoria Atividade Observação Fluxo de controle
Sequência
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
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.
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
Arraste a seguinte atividade para a ramificação Portanto da atividade Se:
Categoria Atividade Observação Fluxo de controle
Sequência
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
Arraste a seguinte atividade para a ramificação Exceto da atividade Se:
Categoria Atividade Observação Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
SendNotification
Arraste a seguinte atividade para a atividade Paralelo para torná-la a ramificação mais à direita
Categoria Atividade Observação Sistema de mensagens
ReceiveAndSendReply
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
Arraste a seguinte atividade para a ramificação Portanto da atividade Se:
Categoria Atividade Observação Fluxo de controle
Sequência
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
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:
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.
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Abaixo do nome da guia, clique em Serviço de pedidos para exibir a atividade Fluxograma "Serviço de pedidos".
A partir do fluxo de trabalho, clique duas vezes na atividade Sequência Pedido concluído para implementar o estado.
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
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
Em Gerenciador de Soluções, expanda OrderWorkflowService 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.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
- 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
Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderProcessingService e clique em Adicionar Referência de Serviço.
Em Adicionar Referência de Serviço, clique em Descobrir. O Visual Studio precisa descobrir ambos os serviços.
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
Em Gerenciador de Soluções, expanda OrderProcessingService e clique duas vezes em OrderProcessing.svc para abri-lo.
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
- 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
Em Gerenciador de Soluções, clique com o botão direito do mouse em ShippingService e clique em Adicionar Referência de Serviço.
Em Adicionar Referência de Serviço, clique em Descobrir. O Visual Studio precisa descobrir ambos os serviços.
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
Em Gerenciador de Soluções, expanda ShippingService e clique duas vezes em Shipping.svc para abri-lo.
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
- 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
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.
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
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.
Em Adicionar Referência de Serviço, clique em Descobrir.
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
Em Gerenciador de Soluções, expanda OrderClient e clique duas vezes em Form1.cs para abri-lo.
Clique com o botão direito do mouse em Form1.cs, clique em Renomear e digite OrderForm.cs.
No prompt, clique em Sim.
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:
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
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:
A partir do fluxo de trabalho, clique em label2 e defina os seguintes valores no painel Propriedades.
Valor da propriedade Nome
lblEmail
Texto
Email:
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:
A partir do fluxo de trabalho, clique em label4 e defina os seguintes valores no painel Propriedades.
Valor da propriedade Nome
lblQuantity
Texto
Quantidade:
A partir do fluxo de trabalho, clique em textbox1 e defina os seguintes valores no painel Propriedades.
Valor da propriedade Nome
txtOrderNumber
Habilitada
False
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
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
A partir do fluxo de trabalho, clique em textbox4 e defina os seguintes valores no painel Propriedades.
Valor da propriedade Nome
txtQuantity
Texto
10
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
“”
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
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
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
Em Gerenciador de Soluções, clique com o botão direito do mouse em OrderForm.cs e clique em Exibir Código.
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.
Em Renomear, digite Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient e clique em OK.
Clique em Aplicar.
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
- 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
No Gerenciador de Soluções, clique com o botão direito do mouse em OrderClient e clique em Definir como Projeto de Início.
A partir do Visual Studio, clique no menu Depurar e clique em Iniciar Depuração. Você verá um Windows Form aberto.
A partir do formulário, clique em Enviar.
Abra Windows Explorer e navegue até a pasta C:\DublinTutorial\Inbox.
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
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderProcessingService e clique em Fazer Remessa/Publicar Configurações.
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
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto OrderProcessingService e clique em Criar Remessa.
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