Este artigo foi traduzido por máquina.

Serviços de fluxo de trabalho

Design visual de fluxos de trabalho com o WCF e o WF 4

Leon Welicki

Baixe o código de exemplo

Desenvolvedores estão cada vez mais adotando arquitetura orientada a serviços (SOA) como uma maneira de criar aplicativos distribuídos. Para não-iniciados, projetar e implementar aplicativos distribuídos e orientada a serviços podem ser complicados. No entanto, o Microsoft .NET Framework 4 facilita mais do que nunca para implementar serviços Windows Communication Foundation (WCF) usando o Windows Workflow Foundation (WF).

OS serviços de fluxo de trabalho do WCF fornecem um ambiente produtivo para a criação de operações demoradas, duráveis ou serviços onde a aplicação de um protocolo de aplicativo por meio de ordenação de operações é importante. Serviços de fluxo de trabalho são implementados usando as atividades do WF que podem fazer uso do WCF para enviar e receber dados.

Neste artigo, explicarei como combinar vários recursos do WCF e WF que foram introduzidos no .NET Framework 4 para modelar um processo de aprovação de hipoteca longa, durável e instrumentada para uma empresa imobiliária, sem precisar escrever código. Este artigo não se destina a ser uma introdução geral à WCF ou o WF, nem faz ele orientá-lo ao longo todo o processo de criação de uma solução de trabalho. Em vez disso, vou se concentrar no uso de importantes recursos novos do .NET Framework 4 por um cenário de práticas de negócios. Uma completa solução de trabalho está incluída no download do código deste artigo.

O cenário

Iniciar Let’s descrevendo o cenário em torno do qual o aplicativo de fluxo de trabalho foi criado. Estrutura da Contoso é uma empresa imobiliária que vende casas e condos. Para fornecer melhor atendimento ao cliente e uma experiência de compra de ponta a ponta, Contoso parceiros com três empresas de hipoteca ajudar os clientes potenciais com suas necessidades de hipoteca. Cada empresa de financiamento oferece diferentes taxas de juros. A Contoso prioriza hipoteca fornecedores por suas taxas de juros para garantir que os clientes obtenham o negócio melhor (usando a suposição de que uma melhor taxa torna mais probabilidade de vender a casa).

Os clientes fornecem seus dados de solicitação hipoteca por meio de um aplicativo da Web. Cada cliente insere um código de cliente, o preço da casa, a quantidade de pagamento para baixo, o período de empréstimo em anos, informações de salário e algumas informações de verificação em segundo plano.

A primeira etapa para o fluxo de trabalho do aplicativo (consulte Figura 1) usa os dados inseridos pelo cliente para o cliente de tela e determinar a qualificação antes para enviar a solicitação para os fornecedores de hipoteca.

Figure 1 The Mortgage Approval Process
Figura 1 O processo de aprovação Mortgage

O aplicativo segue estas regras:

  • Se o candidato tinha um foreclosure, uma falência ou em uma ação judicial, a petição será rejeitada.
  • Se o candidato não tem histórico de crédito e fornece uma entrada menor que 20 por cento, o aplicativo é retornado para revisão (petição incorreta), mas não é rejeitado. O cliente deve fornecer pelo menos 20 por cento para baixo de pagamento para continuar.
  • Se nenhuma das apply acima, a petição é aprovada.

Os fornecedores de hipoteca são contatados acordo com a ordem preferencial da Contoso para petition a solicitação de hipoteca. Se um fornecedor de hipoteca rejeitar o candidato, próximo é solicitado. Há um padrão de contrato de serviço para aprovação de hipoteca solicita que todos os fornecedores implementem. Durante essa etapa do processo, os clientes devem ser capazes de consultar o estado da sua solicitação.

Depois de Petição hipoteca resolvido (um único fornecedor aceitado ou todos rejeitada), a interação com o cliente é registrada no sistema de gerenciamento (CRM) de relacionamento com clientes da Contoso por meio de um serviço exposto pelo sistema de CRM. O resultado é retornado ao cliente.

Observe que o processo de aprovação de hipoteca mostrado na Figura 1 fornece uma descrição geral do processo de negócios, mas não tem qualquer informação sobre como implementá-lo. O serviço de fluxo de trabalho será uma implementação desse processo.

Criando um serviço declarativo

O serviço de fluxo de trabalho irá receber dados do cliente, fazer a triagem inicial, coordenar a conversa com os fornecedores de hipoteca, registre a interação no serviço do CRM e expor o resultado para o cliente.

O serviço será longa (pode levar dias ou meses para ser concluída), duráveis (ele pode salvar o estado e reiniciar mais tarde) e instrumentada (desenvolvedores e usuários poderão saber o que está acontecendo sem ter que o serviço de depuração). Usando o WCF e WF, você pode obter isso declarativamente sem escrever nenhum código — basta montar e configurar os componentes fornecidos pelo .NET Framework. Figura 2 mostra um diagrama de arquitetura da solução.

Figure 2 Architecture of the Solution
Figura 2 Arquitetura da solução

Um serviço de fluxo de trabalho do WCF é contido em um arquivo .xamlx que define o fluxo de trabalho. Você pode definir os processos de negócios visualmente utilizando o designer do WF e o contrato de serviço é inferido com base na estrutura do fluxo de trabalho.

Para criar um serviço de fluxo de trabalho no Visual Studio 2010, criar um novo projeto e selecionar o modelo WCF Workflow Service Application. Este modelo de projeto cria um fluxo de trabalho muito simples (mas em execução) com atividades receber e SendReply. Isso é semelhante a uma classe com um método que recebe um número inteiro e retorna uma seqüência de caracteres. Você pode estender o fluxo de trabalho adicionando mais atividades a ele. Essas atividades podem adicionar operações de lógica ou o serviço de execução.

Para definir o contrato de serviço, você usa as atividades de mensagens fornecidas pelo WF. A configuração do serviço é armazenada no arquivo web.config, assim como nos serviços do WCF normais. Se você abrir o web.config, você verá um arquivo de configuração muito limpo porque os serviços de fluxo de trabalho do WCF a aproveitar os aperfeiçoamentos de configuração do serviço introduzido no WCF 4.

Mensagens de atividades combinam WF e WCF de maneira perfeita. Eles estão projetados para oferecer suporte a fluxos de trabalho orientado a mensagens e fornecem uma melhor integração de mensagens em fluxos de trabalho. Atividades de mensagens permitem que os fluxos de trabalho para enviar dados para outros sistemas (enviar, SendReply e SendAndReceiveReply) e para receber dados de outros sistemas (Receive, ReceiveReply e ReceiveAndSendReply). Eles também incluem atividades para trabalhar com correlação (InitializeCorrelation, CorrelationScope) e transações (TransactedReceiveScope).

Receber e enviar atividades permitem que as interações de mensagens dentro de um fluxo de trabalho de modelagem. O contrato em um serviço pode ser definido ao configurar as atividades receber e enviar nele. Cada recebimento é exposto como uma operação. Cada atividade de envio envia uma mensagem para um serviço. O serviço de destino não tem que utilizar o WCF ou mesmo o .NET Framework como interagir com ele através de protocolos padrão.

Enviar e receber podem ser configurado para usar tanto uma abordagem (RPC) baseados em mensagem em parâmetro ou para receber e enviar os dados reais.  Controla o wire-format na qual os dados são enviados ou recebidos.

Descrever processos em fluxogramas

Você pode modelar o processo usando uma seqüência, mas uma olhada rápida no Figura 1 mostra que algumas indicam que o processo requer um loop volta a uma etapa anterior e que é suportado em fluxos de trabalho seqüenciais não diretamente. (Exigiria a modelagem o loop manualmente usando construções, como durante uma atividade com uma condição cuidadosamente modelada.) Um fluxograma é um melhor ajuste para esse cenário de modelagem.

Fluxograma é uma nova atividade de fluxo de controle introduzida no WF 4 que permite descrever seus processos assim como faria em um quadro de comunicações. Fluxograma descreve processos que são seqüenciais por natureza, um único caminho de execução que pode exigir o loop de volta para uma etapa anterior em determinadas circunstâncias. Descrever o processo, a fluxograma usa setas e caixas, uma abordagem popular entre muitas disciplinas.

O fluxo de trabalho padrão criado pelo modelo de projeto de serviço de fluxo de trabalho do WCF é uma seqüência, mas isso não significa que é a atividade de fluxo de controle somente que você pode usar em serviços de fluxo de trabalho. Para usar um fluxograma (ou qualquer outra atividade composta) como a atividade raiz em um serviço, basta excluir a seqüência e adicionar um fluxograma.

Figura 3 mostra como é fácil um fluxograma pode ser criado a partir dos diagramas que os usuários de negócios normalmente de rascunho para descrever um processo.

Figure 3 The Mortgage Approval Process as a Flowchart
Figura 3 O processo de aprovação Mortgage como um fluxograma

Fluxograma é uma excelente ferramenta para descrever os processos de negócios, minimizando a incompatibilidade entre processos executáveis e a maneira como eles são especificados. Nesse caso, a definição de fluxograma é documentação do processo de.

Mas let’s lento um pouco. Nós já entrou em uma fluxograma vazia para um total em pouquíssimo tempo. Let’s vá ao fluxograma vazia e começar a trabalhar.

O comprador doméstico potencial apresenta seus dados por meio de um aplicativo da Web. Esses dados são passados para o fluxo de trabalho por meio de uma atividade receber. O resultado de incluir uma atividade receber na fluxograma é WorkflowServiceHost expõe um ponto de extremidade que permite que os usuários se comuniquem com o fluxo de trabalho através do envio de mensagens para ele.

Como mencionei anteriormente, pode configurar enviar e receber atividades para usar uma abordagem baseada em mensagem ou baseados em RPC. Nesse caso, configurei a atividade receber para usar uma abordagem baseada em RPC. Isso significa que ele recebe um conjunto de argumentos de entrada, semelhantes a uma chamada de método. Para torná-las disponíveis para o fluxo de trabalho, preciso criar variáveis e ligá-los aos parâmetros (consulte Figura 4). Outra abordagem possível seria ter um DataContract recolhe todos esses campos.

Figure 4 Configuring Input Parameters
Figura 4 Configurando parâmetros de entrada

Se você deseja criar e iniciar uma nova instância do fluxo de trabalho ao receber uma mensagem, você precisará definir a propriedade CanCreateInstance na atividade receber como true. Isso significa que o WorkflowServiceHost criará uma nova instância quando ele recebe uma mensagem desse ponto de extremidade.

A etapa Reticulado com o WF composição de modelagem

Uma vez que você tenha dados no fluxo de trabalho, você pode iniciar o trabalho com ele. A primeira etapa é triagem, que significa verificar um conjunto de condições para determinar se o candidato está qualificado para uma hipoteca antes de entrar em contato com os fornecedores.

Uma abordagem é adicionar várias formas de decisão (FlowDecision) para a fluxograma principal. Isso funciona, mas torna o processo geral de difícil de ler. Além disso, quaisquer modificações as regras de triagem exigiria atualizando o fluxo principal. Fluxograma parece ser uma boa adequada para condições expressing visualmente, mas queremos manter o processo principal enxuto.

Uma solução é adicionar um novo fluxograma dentro de fluxograma existente. WF 4 tem suporte forte para composição em seu núcleo, para que as atividades podem ser compostas livremente. Isso significa que você pode adicionar um novo fluxograma onde quer que você precisa deles, inclusive dentro de uma fluxograma existente. Além disso, a composição é arbitrária e não impor os limites. Você pode combinar atividades existentes para sua conveniência.

O fluxograma filho é exibido recolhidos no pai (o designer do fluxograma não oferece suporte para expandir no local). Você precisará clique duas vezes nele para modelar a lógica de triagem. A fluxograma de triagem (consulte Figura 5) é um filho do fluxograma principal e tem acesso aos seus argumentos e variáveis.

Figure 5 Adding the Screening Flowchart
Figura 5 Adicionando a fluxograma Reticulado

Se você deseja escrever algum código? Você certamente poderia escrever um código para descrever o processo de triagem. Nesse caso, por exemplo, você pode criar um CodeActivity que recebe os dados do cliente como entrada, realiza a verificação (um conjunto de encadeada se as instruções em seu idioma de preferência) e retorna o resultado. Isso tem seu próprio pro e contras. Ele oferece potencialmente melhor desempenho (todas as verificações são executadas dentro de um único pulso de execução) e mais compacto de representação que a abordagem declarativa. Por outro lado, você perde a representação visual do process (opacidade) e alterando o processo requer modificação do código e recompilar.

Enviar resultados para o cliente

Quando a verificação de filtragem for concluída, preciso retornar o resultado para o candidato. Recebi os dados do candidato por meio de uma atividade receber no início do fluxo de trabalho. Para enviar a resposta novamente eu uso uma atividade SendReply (um SendReply para receber um existente pode ser criado clicando com o botão direito do mouse sobre o recebimento e selecionando criar SendReply). A combinação de recebimento e SendReply permite implementar o padrão de troca de mensagens de solicitação-resposta. SendReply está configurado para enviar o resultado da operação e uma mensagem de descrição para o cliente.

Por que SendReply e não enviar? Você pode usar um par de receber e enviar atividades de mensagens duplex do modelo do exchange padrões como “ solicitar e aguardar uma resposta ” (semelhante a um retorno de chamada), mas SendReply é mais adequado à modelagem de padrões de troca de mensagem de solicitação-resposta (semelhantes a uma invocação de método).

Como decidir onde ir Avançar

Quando a filtragem for concluída, o fluxo de trabalho pode continuar o processo de Petição hipoteca. Neste ponto, há duas ramificações: Rejeitar e aprovado, mas quando o candidato precisa fornecer mais dados, o fluxo de trabalho volte à etapa anterior. Fluxograma permite a modelagem deste desenho de linha ação para a etapa em que o fluxo de trabalho prosseguirá.

Para decidir o caminho a ser tomada com base no resultado do bloqueio, posso usar uma atividade FlowSwitch (semelhante a uma instrução switch), conforme mostrado no Figura 6.

Figure 6 Each Outbound Arrow in the FlowSwitch Represents a Case in the Switch
Figura 6 Cada seta de saída no FlowSwitch representa um caso no switch

Correlação

Quando a solicitação de hipoteca é considerada incorreta, o fluxo de trabalho solicita do cliente para fornecer dados adicionais a uma instância de fluxo de trabalho existente. Como posso receber atividade sabe que os dados que ele está recebendo é uma correção dos dados de cliente apresentado anteriormente? Em outras palavras, como pode você enviar outra mensagem para uma instância de um fluxo de trabalho em execução? A resposta é a correlação.

O WF 4 apresenta uma estrutura para correlação. Uma correlação é realmente uma das duas coisas:

  • Uma maneira de agrupar mensagens juntas. Um exemplo clássico é sessões em WCF ou simplesmente ainda mais a relação entre uma mensagem de solicitação e sua resposta.
  • Uma maneira de mapear um segmento de dados para uma instância do serviço de fluxo de trabalho.

Há vários tipos de correlação disponíveis no .NET Framework 4. Uso correlação baseada em conteúdo neste fluxo de trabalho de exemplo. Uma correlação baseada em conteúdo retira dados de mensagem de entrada e mapeia a uma instância existente. Com base em conteúdo correlação é usada quando um serviço de fluxo de trabalho tem vários métodos que são acessados por um único cliente e um pedaço de dados em mensagens trocadas identifica a instância desejada.

Para definir a correlação, eu declare uma variável do tipo CorrelationHandle. Isso é o identificador usado para armazenar as informações de correlação (customerCorrelationHandle na solução complementar). A próxima etapa é usando o identificador de correlação. Grade de propriedades da atividade de recebimento tem uma seção de correlações para configurar a correlação. Ele possui propriedades para configurar um identificador de correlação (CorrelatesWith) para especificar os dados correlacionar em por meio de uma consulta de correlação (CorrelatesOn) e para inicializar um manipulador de correlação (CorrelationInitializers). Configurei os argumentos CorrelatesWith e CorrelatesOn na atividade receber correlacionar o campo customerCode.

CorrelatesOn e CorrelatesWith podem ser confusa. Aqui está uma regra que pode ajudá-lo: um CorrelatesWith recebe um identificador de correlação existente e CorrelatesOn dados especificados por uma consulta de correlação.

Tudo isso pode ser configurado usando o designer do WF.

Desejo correlacionar na identificação de cliente que criação de uma consulta de correlação que extrai o customerCode da mensagem. Observe que consultas de correlação são criadas usando o XPath, mas você Don precisa saber o XPath porque o designer do WF cria a consulta inspecionando o contrato da mensagem recebida para você.

A primeira atividade receber no fluxo de trabalho está configurada para criar uma nova instância de fluxo de trabalho ao receber uma mensagem. No entanto, ele não cria uma nova instância quando eu loop-lo porque ele está configurado para correlacionar sobre o customerCode também. Antes de criar uma nova instância, ele procura uma instância existente com essa chave de correlação.

Solicitando fornecedores taxas

Se a petição passa a triagem, ele é enviado a fornecedores para aluation. Lembre-se de que a Contoso funciona com três fornecedores e tem uma ordem preferencial para fazer negócios com eles. Portanto o processo de pergunta fornecedores em ordem seqüencial até que um aprova.

Todos os fornecedores de implementam um contrato de serviço padrão de solicitação de aprovação de hipoteca. A única diferença entre as solicitações de taxa de juros a três hipoteca fornecedores é o URI do serviço. No entanto, a solicitação de taxa de juros de fornecedor é complicada pelo fato de que ela envolve enviar uma mensagem e aguardando assincronamente em resposta ao responder simultaneamente às solicitações do cliente para o status.

Eu poderia modelar esse processo uma vez e copiá-lo três vezes no fluxo de trabalho, mas isso resultaria em muita duplicação desnecessária e, portanto, um problema sério manutenção. Desejo abstrair esta etapa para que eu possa usar o mesmo processo várias vezes. O ideal é que eu poderia fornecer fluxo de trabalho com alguns dados de entrada e obter um resultado quando é feita e é exatamente quais são as atividades personalizadas para.

4 O WF fornece dois métodos para criação de atividades personalizadas:

  • Declarativa criar uma nova atividade pela composição de outras atividades existentes.
  • Imperativo criar uma nova atividade ao escrever código. Existem várias classes base com diferentes capacidades que podem ser derivadas, incluindo CodeActivity (comportamento simples imperativo), AsyncCodeActivity (funcionam assíncrona) e NativeActivity (interagem com o tempo de execução do WF).

As atividades possuem argumentos que definem suas assinaturas públicas em termos de quais dados eles podem receber (InArgument) e quais dados eles retornarão (OutArgument) quando ele concluir. Minha atividade receberá as informações de hipoteca do cliente e um URI como entrada de serviço e retornará uma mensagem de seqüência de caracteres de taxa de juros e o resultado.

Uso o modelo de item da atividade no Visual Studio para criar uma nova atividade declarativamente utilizando o designer do WF. O designer permite que você criar atividades personalizadas visualmente, arrastando e soltando atividades existentes e definir seus argumentos. O resultado da criação de uma atividade personalizada com o designer é um arquivo XAML que define um x: Class.

Chamei a atividade AskVendor. A atividade AskVendor recebe informações de hipoteca do cliente e o URI do serviço como entrada e fornece uma taxa de juros e uma mensagem de seqüência de caracteres de resultado como saída. Se a taxa for 0, a petição foi rejeitada.

AskVendor envia uma mensagem a um fornecedor de hipoteca pedir uma taxa de juros e aguarda uma resposta do fornecedor. A resposta pode levar minutos, horas ou até mesmo dias para chegar. Enquanto aguarda a resposta, o candidato talvez queira saber o estado do processo. Portanto, a atividade também responde a mensagens de solicitação de status do candidato.

Para processar as duas ações simultaneamente uso uma atividade Parallel como raiz da atividade personalizada. Uma ramificação, tenho todas as atividades de comunicação com um fornecedor de hipoteca e no outro as atividades para ouvir o cliente enquanto aguarda a resposta do fornecedor. Todas as atividades de mensagens usadas dentro de AskVendor são configuradas para correlacionar o campo customerCode. Figura 7 mostra AskVendor atividade personalizada.

Figure 7 AskVendor Custom Activity
Figura 7 Atividade AskVendor personalizada

Como mencionado, a raiz da atividade personalizada é um paralelo. A ramificação esquerda envia uma mensagem para um fornecedor e aguarda uma resposta. Quando a resposta é recebida, ele formata a mensagem de seqüência de caracteres resultante e define o sinalizador de concluído como true. A ramificação direita escuta as solicitações de consulta de estado do candidato. O recebimento e SendReply estão dentro de um While atividade é executada até que o sinalizador de concluído seja verdadeiro. Condição de conclusão da atividade Parallel (executada quando uma ramificação é concluída) define o sinalizador de concluído como true. Portanto, quando conclui a ramificação esquerda (mensagem do fornecedor é recebida), a variável concluída é sinalizada como true e While à direita também for concluída.

Atividades personalizadas são exatamente como qualquer outra atividade. Quando você cria uma atividade personalizada ele aparece automaticamente na caixa de ferramentas atividades. E usá-lo não é diferente de usar qualquer outra atividade existente: Arraste-o na caixa de ferramentas, solte-o no designer e configurar seus argumentos. Como eu ainda não criou um designer para essa atividade, o designer do padrão atribuído a ela (um retângulo onde você pode definir a propriedade DisplayName). Grade de propriedades exibe automaticamente todos os argumentos da atividade.

Mencionei anteriormente o suporte de alta segurança para composição no WF 4. Isso também se aplica a atividades personalizadas. Se você criar sua própria atividade composta, você poderá livremente redigi-la com qualquer outra atividade existente como seqüência, fluxograma, paralela ou até mesmo outras atividades personalizadas.

Invocar o serviço do CRM

Sistema CRM da Contoso expõe a funcionalidade central como serviços. Um desses serviços permite registrar uma interação com um cliente. Eu poderia chamá-la usando uma atividade de envio, mas isso seria implica configurar manualmente a atividade e importar seus contratos de dados do serviço.

Seria ótimo se eu poderia simplesmente importar o serviço no WF e executá-lo. Isso é exatamente o que faz Add Service Reference em um projeto de serviço de fluxo de trabalho: Considerando o contrato de serviço, ele cria automaticamente atividades de proxy (um para cada operação no serviço) que podem ser usadas para invocar o serviço (consulte Figura 8). Nesse caso, o contrato de serviço CRM tem três operações para que “ adicionar referência de serviço ” criou três atividades, que são exibidas na caixa de ferramentas.

Figure 8 Adding a Service Reference to the CRM Service
Figura 8 Adicionar uma referência de serviço para o serviço do CRM

O resultado de comunicação

Finalmente, eu preciso fornecer os resultados para o cliente. Para manter o aplicativo simples, posso simplesmente usar uma atividade ReceiveAndSendReply que expõe o resultado para o cliente. Depois que o cliente lê o resultado, o fluxo de trabalho completa.

Para fazer isso, preciso descartar um ReceiveAndSendReply na fluxograma. Observe que, quando você solta a atividade na superfície de design, você obter uma seqüência de recolhido. Isso ocorre porque ReceiveAndSendReply é um modelo de atividade, o que significa que ele é um conjunto pré-configurado de atividades (no caso uma seqüência com um recebimento e uma SendReply). Você viu isso anteriormente quando adicionei o fluxograma filho para exibição na tela.

Para configurar ReceiveAndSendReply, preciso analisar e defina as informações do ponto de extremidade na atividade receber. Também preciso configurar receber para correlacionar pela identificação do cliente para que, quando o cliente envia uma mensagem com sua customerCode, ele receberá uma resposta.

Trabalho de longa execução

Depois que o fluxo de trabalho envia uma solicitação de aprovação para um fornecedor, a instância do serviço será ser sentado ocioso aguardando uma resposta. A resposta pode vir em minutos, horas, dias ou até mesmo semanas. Isso apresenta alguns desafios interessantes. Você provavelmente Don quer manter todas as instâncias na memória, pois o que pode consumir recursos do sistema desnecessários e Don dimensionar. E se o processo de host falha (ou em um cenário menos apocalyptic, precisa ser encerrado para manutenção), quaisquer instâncias inacabadas seriam perdidas.

Não seria ótimo se, quando uma instância não está fazendo qualquer trabalho, você apenas poderia salvá-lo em armazenamento durável e removê-lo da memória? Você pode, por meio da estrutura de persistência do WF, que permite salvar uma instância de fluxo de trabalho para uma mídia de armazenamento a serem recuperados posteriormente.

Isso significa que instâncias não estão ligadas a qualquer processo existente ou a máquina. O bloqueio pode ocorrer em um processo, pedir o primeiro fornecedor uma taxa pode ocorrer em outro do fluxo de trabalho de exemplo, e receber a resposta pode ocorrer em um terceiro — sem afetar os seus dados ou a execução da instância do fluxo de trabalho. Isso atende melhor utilização dos recursos, melhorando a escalabilidade e fornecer resistência de — um travamento no host não produz a perda de instâncias ativas porque poderá ser retomadas do ponto em que eles foram mantidos pela última vez.

Instâncias de fluxo de trabalho são salvas em um armazenamento de instância. 4 O WF inclui um armazenamento de instância do SQL Server e a estrutura de persistência é extensível, portanto, você pode escrever seus próprios. (O exemplo PurchaseProcess no SDK mostra como criar um armazenamento de instância do arquivo de texto muito simples, por exemplo.)

Uso o armazenamento de instância do SQL Server interno para persistir instâncias de fluxo de trabalho Contoso. A boa notícia é que você Don precise escrever qualquer código para usá-lo. Em serviços de fluxo de trabalho, persistência é um comportamento que pode ser configurado no arquivo web.config da seguinte forma:

<!--Set up SQL Instance Store-->
<sqlWorkflowInstanceStore connectionString="Data Source=.\SQLExpress;Initial Catalog=InstanceStore;
Integrated Security=True;Asynchronous Processing=True"/>
          
<!--Set the TimeToUnload to 0 to force the WF to be unloaded. To have a durable delay, the workflow needs to be unloaded-->
<workflowIdle timeToUnload="0"/>

A primeira linha configura o comportamento de persistência para usar o armazenamento de instância do SQL Server. A segunda linha instrui a estrutura de persistência para persistir e descarregar instâncias assim que elas ficam ociosas (Isso significa que quando você executa um recebimento e permanecer ocioso aguardando uma resposta, a instância do fluxo de trabalho será descarregada e salvo no banco de dados).

Se um fluxo de trabalho é configurado para ser persistente e tiver configurado correlação, o host (WorkflowServiceHost) responsável por carregar a instância correta quando uma mensagem chega baseia-se em informações correlação.

Suponha que você tiver uma instância que está configurada para correlacionar em customerCode, diga para customerCode = 43. Pedir um fornecedor de hipoteca de uma taxa e a instância é mantida enquanto aguarda a resposta (persistência inclui salvar informações de correlação). Quando a empresa de financiamento envia de volta uma mensagem para customerCode = 43, WorkflowServiceHost automaticamente carrega essa instância do armazenamento de instância e envia a mensagem.

Observe que o armazenamento de instância do SQL não é instalado por padrão. Você precisará instalá-lo explicitamente executando um conjunto de scripts fornecidos com o .NET Framework 4.

O serviço de rastreamento

Então, tenho um serviço de execução demorada que se comunica com outros serviços de forma baseada em mensagens. O serviço está configurado para ser durável, faz parte do seu trabalho em paralelo e pode executar as atividades assíncronas. Isso parece muito complexo. Se algo der errado? Como você pode dizer qual atividade falha? Se você quer saber o que está acontecendo com uma instância do serviço?

O Visual Studio permite a depuração de fluxos de trabalho (e você pode fazer etapa depuração no designer do WF, definir pontos de interrupção, como se estivesse no código), mas isso não é uma opção em ambientes de produção.

Em vez disso, o WF inclui uma infra-estrutura de controle avançado que fornece dados sobre fluxos de trabalho em execução. Controle informa sobre coisas que acontecem no fluxo de trabalho (rastreamento de eventos) a um participante de rastreamento que salva esses eventos. Perfis de rastreamento permitem que os eventos que recebe um participante de controle para que ele possa obter apenas as informações necessárias de filtragem.

4 O WF fornece um participante de rastreamento que salva dados no log de eventos do Windows (EtwTrackingParticipant). Você pode criar seus próprios participantes de rastreamento, estendendo TrackingParticipant. Para este fluxo de trabalho, usei o EtwTrackingParticipant padrão. Você Don precise escrever qualquer código para usá-lo; apenas fornecer configuração correta no arquivo web.config. Inicio ao configurar o serviço para usar o EtwTrackingParticipant:

<!--Set up ETW tracking -->
<etwTracking profileName="HealthMonitoring "/>

Eu também defini-la para usar um perfil de HealthMonitoring fornece eventos que ajudarão a avaliar a integridade de nosso serviço (consulte Figura 9). Agora o serviço fornece informações sobre eventos que ajudam a monitorar sua integridade e corrigir problemas em que aparecem. O SDK fornece vários exemplos que mostram como criar seu próprio controle participante e como escrever um perfil de solução de problemas.

Figura 9 Especificar o perfil de participante do controle

<tracking>
  <profiles>
    <!--The health monitoring profile queries for workflow instance level records and for workflow activity fault propagation records-->
    <trackingProfile 
      name="HealthMonitoring">
      <workflow activityDefinitionId="*">
        <workflowInstanceQueries>
          <workflowInstanceQuery>
            <states>
              <state name="Started"/>
              <state name="Completed"/>
              <state name="Aborted"/>
              <state name="UnhandledException"/>
            </states>
          </workflowInstanceQuery>
        </workflowInstanceQueries>
        <faultPropagationQueries>
          <faultPropagationQuery 
            faultSourceActivityName ="*" 
            faultHandlerActivityName="*"/>
        </faultPropagationQueries>
      </workflow>
    </trackingProfile>
  </profiles>
</tracking>

Implantando e consumindo o serviço

Assim, eu já criaram um fluxo de trabalho utilizando o designer e configurado para usar persistência e rastreamento. A única tarefa restante é hospedar e executá-lo.

Durante o desenvolvimento, você pode hospedar o serviço com o host de serviço da Web interno no Visual Studio 2010. Para fazer isso, você apenas precisa executar o projeto com o serviço e terminar.

Somente é ligeiramente mais complexo que hospeda o serviço em um ambiente de produção. É possível hospedar serviços de fluxo de trabalho do WCF no IIS ou AppFabric extensões de servidor de aplicativo. Com o Visual Studio 2010, você pode criar um pacote que pode ser diretamente importado para o IIS. Se você decidir usar AppFabric, você vai poderá tirar proveito dos recursos como o painel de ferramentas, que fornece informações resumidas sobre as instâncias do serviço, e consultar rastreamento gravado.

A etapa final é realmente usar o serviço. Nesse cenário, a Contoso queria uma interface baseada na Web para permitir que os usuários interagem com o serviço. Isso significa que consome o serviço a partir de um aplicativo ASP.NET.

O exemplo de serviço de fluxo de trabalho do WCF você viu aqui é como qualquer outro serviço do WCF que você pode escrever em código sem formatação. Para consumi-lo, você precisará adicionar uma referência de serviço no projeto cliente. Esta referência de serviço cria o cliente proxies para invocar o serviço.

Com a referência em mãos, você pode chamar o serviço. O cliente para este serviço possui uma operação para cada atividade receber no serviço. Figura 10 mostra o código usado para solicitar uma aprovação de hipoteca (e, portanto, inicie uma nova instância do serviço).

Figura 10 Consumindo o serviço

protected void OnSubmit(object sender, EventArgs e) {
  using (ContosoRealEstate.ContosoRealEstateClient client = 
    new ContosoRealEstate.ContosoRealEstateClient()) {

    string message = "";        
    string result = client.EvaluateMortgage(
      out message,
      this.txtId.Text,
      Convert.ToInt32(this.txtHousePrice.Text),
      Convert.ToInt32(this.txtDownpayment.Text),
      Convert.ToInt32(this.txtYears.Text),
      Convert.ToInt32(this.txtSalary.Text),
      this.chkCreditHistory.Checked,
      this.chkBankrupcy.Checked,
      this.chkLawsuit.Checked,
      this.chkForeclosure.Checked);
    lblMessage.CssClass= result;
    lblMessage.Text = message + " (" + result + ")";

    this.btnSubmit.Visible = result.Equals("Incorrect");
    this.btnMonitor.Visible = result.Equals("Approved");
  } 
}

Fechar anotações

Como você viu, o .NET Framework 4 fornece um conjunto de recursos avançados que pode ser usado para criar soluções reais complexas ao montar os componentes existentes.A estrutura também fornece pontos de extensibilidade para adaptar esses componentes às necessidades específicas que acomodam uma ampla variedade de cenários.

OS serviços de fluxo de trabalho do WCF lhe permitem descrever um processo de execução demorada, durável, instrumentado declarativamente simplesmente composing existentes atividades e configurando o serviço — Embora você também pode escrever seu próprio código, se necessário.

Neste artigo, eu combinado de vários recursos no WF 4 e 4 do WCF para criar um serviço que faz algum trabalho sozinho e coordena conversas com outros serviços existentes.Criei todo o serviço sem escrever código, incluindo um novo artefato (uma atividade personalizada).

Há muito mais, que você pode fazer com essas tecnologias .NET Framework 4.

Leon Welicki  é um gerente de programa na equipe do WF na Microsoft e se concentra nas atividades e o tempo de execução do WF. Antes de se juntar a Microsoft, trabalhou como conduzir arquiteto e dev Gerenciador para uma empresa de telecomunicações Espanhol grande e como professor associar externo sobre o professores de ciências computador graduado com a Universidade de Salamanca Pontifical em Madri.

Graças aos seguintes especialistas técnicos para revisar este artigo: Dave Cliffe, Vikram Desai, Kavita Kamani e Bob Schmidt