Extensibilidade de host de serviço do fluxo de trabalho
O .NET Framework 4.6.1 fornece a classe WorkflowServiceHost para hospedar serviços de fluxo de trabalho. Essa classe é usada quando você está hospedando automaticamente um serviço de fluxo de trabalho em um aplicativo gerenciado ou em um serviço do Windows. Essa classe também é usada ao hospedar um serviço de fluxo de trabalho com Serviços de Informações da Internet (IIS) ou Serviço de Ativação de Processos do Windows (WAS). A classe WorkflowServiceHost fornece pontos de extensão que permitem adicionar extensões personalizadas, alterar o comportamento ocioso e hospedar fluxos de trabalho não-serviço (fluxos de trabalho que não usam atividades de mensagens).
Extensões de host de serviço do fluxo de trabalho
O WorkflowServiceHost contém uma propriedade WorkflowExtensions do tipo WorkflowInstanceExtensionManager que fornece métodos para adicionar extensões ao WorkflowServiceHost. Use o método Add para adicionar uma extensão para cada instância de serviço de fluxo de trabalho. O delegado especificado é chamado para criar uma nova extensão quando uma instância de serviço de fluxo de trabalho é criada ou carregada de um armazenamento de persistência. Use o método Add para adicionar uma extensão para cada host de serviço de fluxo de trabalho, uma instância da extensão é compartilhada para todas as instâncias de serviço de fluxo de trabalho.
Reagir a exceções não tratadas
O WorkflowUnhandledExceptionBehavior permite especificar a ação a ser executada se ocorrer uma exceção sem tratamento em um serviço de fluxo de trabalho. A propriedade Action especifica um dos valores WorkflowUnhandledExceptionAction:
Abandon – Anula a instância do serviço de fluxo de trabalho.
AbandonAndSuspend – Reverte para o último estado persistente e suspende a instância do serviço de fluxo de trabalho. Isso ocorre apenas se o fluxo de trabalho já tiver persistido pelo menos uma vez. Caso contrário, a instância de fluxo de trabalho é anulada.
Cancel – Cancela a instância.
Terminate – Encerra a instância.
Esse comportamento pode ser configurado no código conforme mostrado no exemplo a seguir.
host.Description.Behaviors.Add(new WorkflowUnhandledExceptionBehavior { Action = WorkflowUnhandledExceptionAction.Abandon });
Também pode ser configurado em um arquivo de configuração, conforme mostrado no exemplo a seguir.
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<workflowUnhandledExceptionBehavior action="Abandon" />
</behavior>
</serviceBehaviors>
</behaviors>
Hospedagem de fluxos de trabalho não-serviço
WorkflowServiceHost pode ser usado para hospedar fluxos de trabalho não-serviço ou fluxos de trabalho que não comecem com uma atividade Receive ou fluxos de trabalho que não usam as atividades de mensagens. Os serviços de fluxo de trabalho normalmente começam com uma atividade Receive. Quando WorkflowServiceHost recebe um a mensagem para um serviço de fluxo de trabalho, se ela ainda não estiver em execução (ou persistida), uma nova instância de serviço de fluxo de trabalho será criada. Se um fluxo de trabalho não começar com uma atividade de recebimento, ele não poderá ser iniciado enviando uma mensagem porque não há atividade para receber a mensagem. Para hospedar um fluxo de trabalho não-serviço, derive uma classe de WorkflowHostingEndpoint e substitua OnGetInstanceId, OnGetCreationContext e OnResolveBookmark. Substitua OnGetInstanceId se desejar fornecer um ID de instância preferencial. Substitua OnGetCreationContext para criar um contexto de criação de fluxo de trabalho personalizado ou preencha uma instância de WorkflowCreationContext existente. Substitua OnResolveBookmark para extrair manualmente o marcador da mensagem recebida. Se você substituir esse método, deverá invocar SendResponse em seu corpo para responder à mensagem enviada ao WorkflowHostingEndpoint. Se você não fizer isso, um limite de MaxConcurrentCalls pode eventualmente ser ultrapassado. Em contratos bidirecionais, você pode detectar sua falha ao invocar SendResponse devido à falha do cliente em receber uma resposta. Em contratos unidirecionais, você pode não reconhecer o erro de falha ao ligar para SendResponse até que seja tarde demais, depois que o limite de restrição de MaxConcurrentCalls for ultrapassado. Para criar uma nova instância de um fluxo de trabalho não-serviço, declare um contrato de serviço que defina uma operação que cria uma nova instância. A operação de criação deve usar um IDictionary<string, object> para passar quaisquer parâmetros de fluxo de trabalho necessários. Este contrato é implementado implicitamente pela classe derivada de WorkflowHostingEndpoint. Ao hospedar o fluxo de trabalho, adicione uma instância da classe derivada de WorkflowHostingEndpoint ao host chamando AddServiceEndpoint e chame Open. Para criar uma instância do fluxo de trabalho, crie um ChannelFactory<TChannel> do seu tipo de contrato de serviço e chame CreateChannel. Você pode então chamar a operação de criação definida em seu contrato de serviço.