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 um serviço do Windows. Essa classe também é usada ao hospedar um serviço de fluxo de trabalho com o IIS (Serviços de Informações da Internet) ou o Serviço de Ativação de Processos 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 que não são de serviço (fluxos de trabalho que não usam atividades de mensagens).
Extensões de host do serviço de fluxo de trabalho
O WorkflowServiceHost contém uma WorkflowExtensions propriedade 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 especificar a ação a ser executada se ocorrer uma exceção sem tratamento em um 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ó ocorre se o fluxo de trabalho já tiver sido persistido pelo menos uma vez. Caso contrário, a instância do fluxo de trabalho será anulada.
Cancel – Cancela a instância.
Terminate – Encerra a instância.
Esse comportamento pode ser configurado no código como 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 não relacionados ao serviço
WorkflowServiceHost pode ser usado para hospedar fluxos de trabalho que não sejam de serviço ou fluxos de trabalho que não comecem 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 Receive atividade. Quando o WorkflowServiceHost recebe uma mensagem para um serviço de fluxo de trabalho, se ele ainda não estiver em execução (ou persistido), 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 Receber, 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 de WorkflowHostingEndpoint e substitua OnGetInstanceId, OnGetCreationContexte OnResolveBookmark. Substitua OnGetInstanceId se quiser fornecer um ID de instância preferencial. Substituir OnGetCreationContext para criar um contexto de criação de fluxo de trabalho personalizado ou preencher uma instância do WorkflowCreationContext. Substitua OnResolveBookmark para extrair manualmente o marcador da mensagem de entrada. Se você substituir esse método, você deve invocar SendResponse em seu corpo para responder à mensagem enviada para o WorkflowHostingEndpoint. Se não o fizer, um MaxConcurrentCalls limite pode eventualmente ser excedido. Em contratos bidirecionais, você pode ser capaz de detetar sua falha em invocar SendResponse devido à falha do cliente em receber uma resposta. Em contratos unidirecionais, você pode não reconhecer o erro de não ligar SendResponse até que seja tarde demais, depois que o MaxConcurrentCalls limite de aceleração for excedido. 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 ter uma cadeia de caracteres IDictionary<, objeto> para passar quaisquer parâmetros de fluxo de trabalho necessários. Este contrato é implicitamente implementado pela WorkflowHostingEndpointclasse derivada. Ao hospedar o fluxo de trabalho, adicione uma instância da WorkflowHostingEndpointclasse -derived ao host chamando AddServiceEndpoint e chamando 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. Em seguida, você pode chamar a operação de criação definida em seu contrato de serviço.