Compartilhar via


Extensibilidade do Host do Serviço de Fluxo de Trabalho

O .NET Framework 4.6.1 fornece a WorkflowServiceHost classe 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 os Serviços de Informações da Internet (IIS) ou o Serviço de Ativação de Processo do Windows (WAS). A WorkflowServiceHost classe 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 do Host do Serviço de Fluxo de Trabalho

WorkflowServiceHost contém uma propriedade WorkflowExtensions do tipo WorkflowInstanceExtensionManager que fornece métodos para adicionar extensões ao WorkflowServiceHost. Use o Add método 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 repositório de persistência. Use o Add método 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 que você especifique uma ação a ser tomada se ocorrer uma exceção sem tratamento no serviço de fluxo de trabalho. A Action propriedade especifica um dos WorkflowUnhandledExceptionAction valores:

  • 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 só ocorrerá se o fluxo de trabalho já tiver sido persistente pelo menos uma vez. Se não, a instância do fluxo de trabalho é interrompida.

  • 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 });

Ele 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 que não são de serviço

WorkflowServiceHost pode ser usado para hospedar fluxos de trabalho que não são de serviço ou fluxos de trabalho que não começam com uma Receive atividade 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 o serviço de fluxo de trabalho WorkflowServiceHost recebe uma mensagem, se ele ainda não estiver executando (ou persistido), uma nova instância do serviço de fluxo de trabalho é 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á nenhuma atividade para receber a mensagem. Para hospedar um fluxo de trabalho que não seja de serviço, derive uma classe a partir 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 MaxConcurrentCalls limite poderá eventualmente ser excedido. 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 que não seja de serviço, declare um contrato de serviço que define uma operação que cria uma nova instância. A operação de criação deve usar uma cadeia de caracteres IDictionary<, objeto> para passar todos os parâmetros de fluxo de trabalho necessários. Esse contrato é implementado implicitamente pela WorkflowHostingEndpointclasse derivada. Ao hospedar o fluxo de trabalho, adicione uma instância da classe derivada WorkflowHostingEndpoint ao host chamando AddServiceEndpoint e Open. Para criar uma instância do fluxo de trabalho, crie uma instância do tipo de contrato de serviço ChannelFactory<TChannel> e chame CreateChannel. Em seguida, você pode chamar a operação de criação definida em seu contrato de serviço.

Consulte também