Visão geral dos serviços de fluxo de trabalho
Os serviços de fluxo de trabalho são serviços baseados em WCF que são implementados usando fluxos de trabalho. Serviços de fluxo de trabalho são fluxos de trabalho que usam as atividades de mensagens para enviar e receber mensagens do Windows Communication Foundation (WCF). O .NET Framework 4.5 apresenta várias atividades de mensagens que permitem enviar e receber mensagens de dentro de um fluxo de trabalho. Para obter mais informações sobre atividades de mensagens e como elas podem ser usadas para implementar diferentes padrões de troca de mensagens, consulte Atividades de mensagens.
Benefícios do uso de serviços de fluxo de trabalho
À medida que as aplicações se tornam cada vez mais distribuídas, os serviços individuais tornam-se responsáveis por chamar outros serviços para descarregar parte do trabalho. A implementação dessas chamadas como operações assíncronas introduz alguma complexidade no código. O tratamento de erros adiciona complexidade adicional na forma de lidar com exceções e fornecer informações detalhadas de rastreamento. Alguns serviços geralmente são de longa execução e podem ocupar recursos valiosos do sistema enquanto aguardam a entrada. Devido a esses problemas, os aplicativos distribuídos geralmente são muito complexos e difíceis de escrever e manter. Os fluxos de trabalho são uma forma natural de expressar a coordenação do trabalho assíncrono, especialmente chamadas para serviços externos. Os fluxos de trabalho também são eficazes na representação de processos de negócios de longa duração. São essas qualidades que tornam o fluxo de trabalho um grande trunfo para a criação de serviços em um ambiente distribuído.
Implementando um serviço de fluxo de trabalho
Ao implementar um serviço WCF, você define vários contratos que descrevem o serviço e os dados que ele envia e recebe. Os dados são representados como contratos de dados e contratos de mensagem. Tanto o WCF quanto os serviços de fluxo de trabalho usam definições de contrato de dados e contrato de mensagem como parte das descrições de serviço. O próprio serviço expõe metadados (na forma de WSDL) para descrever as operações do serviço. No WCF, os contratos de serviço e os contratos de operação definem o serviço e as operações que ele suporta. No entanto, em um serviço de fluxo de trabalho, esses contratos fazem parte do próprio processo comercial. Eles são expostos em metadados por um processo chamado inferência de contrato. Quando um serviço de fluxo de trabalho é hospedado usando WorkflowServiceHosto , a definição do fluxo de trabalho é examinada e um contrato é gerado com base no conjunto de atividades de mensagens encontradas no fluxo de trabalho. Em particular, as seguintes atividades e propriedades são usadas para gerar o contrato:
Receive Atividade
SendReply Atividade
TransactedReceiveScope Atividade
O resultado final da inferência de contrato é uma descrição do serviço usando as mesmas estruturas de dados que os contratos de serviços e operação do WCF. Essas informações são usadas para expor WSDL para o serviço de fluxo de trabalho.
Nota
O .NET Framework 4.6.1 não permite que você escreva serviços de fluxo de trabalho usando uma definição de contrato existente sem algum suporte de ferramentas adicionais. Os contratos de serviço de fluxo de trabalho são criados pelo processo de inferência de contrato discutido anteriormente. No entanto, os contratos de mensagens e de dados são totalmente suportados.
Serviços de fluxo de trabalho e associações baseadas em MSMQ
WCF define duas associações NetMsmqBinding baseadas em MSMQ e MsmqIntegrationBinding. As associações baseadas em MSMQ são frequentemente usadas com serviços de fluxo de trabalho devido à natureza de longa duração desses serviços. As associações baseadas em MSMQ têm uma ValidityDuration
propriedade que especifica por quanto tempo as mensagens MSMQ podem assumir como válidas. Devido à natureza de longa execução dos serviços de fluxo de trabalho, é possível que a duração de validade de uma mensagem MSMQ possa decorrer antes que o serviço de fluxo de trabalho possa processá-la. Por conseguinte, é muito importante definir a duração de validade de uma ligação MSMQ para um valor adequado. Esse valor deve ser escolhido com base no fluxo de trabalho e na forma como ele processa as mensagens. Por exemplo, se você tiver um fluxo de trabalho com uma Receive atividade seguida por uma atividade personalizada que leva 10 minutos para ser executada, seguida por outra Receive atividade, o valor correto para ValidityDuration
será maior que 10 minutos.
Hospedando um serviço de fluxo de trabalho
Como os serviços WCF, os serviços de fluxo de trabalho devem ser hospedados. Os serviços WCF usam a classe para hospedar serviços e os ServiceHost serviços de fluxo de trabalho usam WorkflowServiceHost para hospedar serviços. Como os serviços WCF, os serviços de fluxo de trabalho podem ser hospedados de várias maneiras, por exemplo:
Em um aplicativo .NET Framework gerenciado.
Nos Serviços de Informações da Internet (IIS).
No Serviço de Ativação de Processos do Windows (WAS).
Em um serviço gerenciado do Windows.
Os serviços de fluxo de trabalho hospedados em um aplicativo .NET Framework gerenciado ou em um serviço gerenciado do Windows criam uma instância da WorkflowServiceHost classe e passam uma instância da WorkflowService que contém a definição de fluxo de trabalho dentro da Body propriedade. Uma definição de fluxo de trabalho que contém atividades de mensagens é exposta como um serviço de fluxo de trabalho.
Para hospedar um serviço de fluxo de trabalho no IIS ou WAS, coloque o arquivo .xamlx que contém a definição de serviço de fluxo de trabalho em um diretório virtual. Um ponto de extremidade padrão (usando BasicHttpBinding) é criado automaticamente Para obter mais informações, consulte Configuração simplificada. Você também pode colocar um arquivo Web.config no diretório virtual para especificar seus próprios pontos de extremidade. Se sua definição de fluxo de trabalho estiver em um assembly, você poderá colocar um arquivo .svc no diretório virtual e o assembly de fluxo de trabalho no diretório App_Code. O arquivo .svc deve especificar a fábrica do host de serviço e a classe que implementa o serviço de fluxo de trabalho. O exemplo a seguir mostra como especificar a fábrica do host de serviço e especificar a classe que implementa o serviço de fluxo de trabalho.
<%@ServiceHost Factory="System.ServiceModel.Activities.Activation.WorkflowServiceHostFactory"
Service="EchoService"%>