Visão geral de 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. Os serviços de fluxo de trabalho são fluxos de trabalho que usam as atividades de mensagens para enviar e receber mensagens do WCF (Windows Communication Foundation). O .NET Framework 4.5 introduz uma série de 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 os aplicativos se tornam cada vez mais distribuídos, os serviços individuais se tornam responsáveis por chamar outros serviços para descarregar parte do trabalho. Implementar essas 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 acompanhamento. Alguns serviços geralmente são de execução prolongada 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 maneira 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 execução. São essas qualidades que tornam o fluxo de trabalho um ótimo ativo para a criação de serviços em um ambiente distribuído.

Implementar um serviço de fluxo de trabalho

Ao implementar um serviço WCF, você define uma série de 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 mensagens. Tanto o WCF quanto os serviços de fluxo de trabalho usam definições de contrato de dados e de 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 com as quais ele dá suporte. No entanto, em um serviço de fluxo de trabalho, esses contratos fazem parte do próprio processo de negócios. Eles são expostos em metadados por um processo chamado inferência de contrato. Quando um serviço de fluxo de trabalho é hospedado usando WorkflowServiceHost, a definição de 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 do 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 o WSDL para o serviço de fluxo de trabalho.

Observação

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 a ferramentas adicionais. Os contratos de serviço de fluxo de trabalho são criados pelo processo de inferência do contrato discutido anteriormente. No entanto, os contratos de mensagens e os contratos de dados têm suporte total.

Serviços de fluxo de trabalho e associações baseadas em MSMQ

O WCF define duas associações baseadas em MSMQ, NetMsmqBinding e MsmqIntegrationBinding. As associações baseadas em MSMQ geralmente são usadas com serviços de fluxo de trabalho devido à natureza de execução prolongada desses serviços. As associações baseadas em MSMQ têm uma propriedade ValidityDuration que especifica quanto tempo as mensagens MSMQ podem assumir ser válidas. Devido à natureza de execução prolongada dos serviços de fluxo de trabalho, é possível que a duração da validade de uma mensagem MSMQ possa terminar antes que o serviço de fluxo de trabalho possa processá-la. Portanto, é muito importante definir a duração da validade de uma associação MSMQ para um valor apropriado. Esse valor deve ser escolhido com base no fluxo de trabalho e em como processa mensagens. Por exemplo, se você tiver um fluxo de trabalho com uma atividade Receive seguida por uma atividade personalizada que leva 10 minutos para ser executada, seguida por outra atividade Receive, o valor correto para ValidityDuration seria maior que 10 minutos.

Adicionar um serviço de fluxo de trabalho

Assim como os serviços WCF, os serviços de fluxo de trabalho devem ser hospedados. Os serviços do WCF usam a classe ServiceHost para hospedar serviços e os serviços de fluxo de trabalho usam WorkflowServiceHost para hospedar serviços. Assim como os serviços WCF, os serviços de fluxo de trabalho podem ser hospedados de várias maneiras, como, por exemplo:

  • Em um aplicativo gerenciado do .NET Framework.

  • No Internet Information Services (IIS).

  • Serviço de Ativação de Processos do Windows (WAS).

  • Nos serviços gerenciados do Windows.

Os serviços de fluxo de trabalho hospedados em um aplicativo .NET Framework gerenciado ou um serviço Gerenciado do Windows criam uma instância da classe WorkflowServiceHost e passam uma instância da WorkflowService que contém a definição de fluxo de trabalho dentro da propriedade Body. 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 do 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 a definição do fluxo de trabalho estiver em um assembly, você poderá colocar um arquivo .svc no diretório virtual e no assembly de fluxo de trabalho no diretório App_Code. O arquivo .svc deve especificar a fábrica de 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 de 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"%>