Controle de versão lado a lado no WorkflowServiceHost

O controle de versões lado a lado do WorkflowServiceHost introduzidas no .NET Framework 4.5 fornece a capacidade de hospedar várias versões de um serviço de fluxo de trabalho em um único ponto de extremidade. A funcionalidade de lado a lado fornecida permite que um serviço de fluxo de trabalho seja configurado para que novas instâncias do serviço de fluxo de trabalho sejam criadas usando a nova definição de fluxo de trabalho, enquanto executa instâncias completas usando a definição existente. Este tópico fornece uma visão geral da execução lado a lado do serviço de fluxo de trabalho usando WorkflowServiceHost.

Hospedando várias versões em um serviço de fluxo de trabalho

WorkflowServiceHost contém duas propriedades que podem ser configuradas para permitir que várias versões de um fluxo de trabalho sejam executadas lado a lado: SupportedVersions e DefinitionIdentity. SupportedVersions contém as versões suportadas do serviço de fluxo de trabalho, e DefinitionIdentity é usado para identificar exclusivamente cada serviço de fluxo de trabalho. Isso é feito por meio da associação de um WorkflowIdentity com o serviço de fluxo de trabalho. Uma instância WorkflowIdentity contém três informações de identificação. Name e Version contêm um nome e um Version e são necessários, e Package é opcional e pode ser usado para especificar uma cadeia de caracteres adicional que contém informações como o nome do assembly ou outras informações desejadas. Cada serviço de fluxo de trabalho contido na coleção SupportedVersions deve ter um único WorkflowIdentity. Um WorkflowIdentity é exclusivo se qualquer uma de suas três propriedades for diferente da outra WorkflowIdentity. Um nullWorkflowIdentity é um valor permitido para DefinitionIdentity, mas apenas uma versão anterior de um serviço de fluxo de trabalho pode ter um nullWorkflowIdentity.

Importante

Um WorkflowIdentity não deve conter informações pessoalmente identificáveis (PII). WorkflowIdentity é composto por três partes : um Name (String), um Version (Version) e um Package (String). As informações sobre o WorkflowIdentity usadas para criar uma instância são emitidas para todos os serviços de rastreamento configurados em vários pontos diferentes do ciclo de vida da atividade em runtime. O Rastreamento WF não tem nenhum mecanismo para ocultar o PII (dados de usuário confidenciais). Portanto, uma instância WorkflowIdentity não deve conter nenhum dado de PII porque será emitido pelo runtime em registros de rastreamento e pode estar visível para qualquer um com acesso para exibir os registros de rastreamento.

Regras para hospedar várias versões de um serviço de fluxo de trabalho

Quando um usuário adiciona uma versão adicional ao WorkflowServiceHost, há várias condições que devem ser cumpridas para que um serviço de fluxo de trabalho seja hospedado com o mesmo conjunto de pontos de extremidade e uma descrição. Se qualquer uma das versões adicionais não atenderem a essas condições, o WorkflowServiceHost gera uma exceção quando Open é chamado. Cada definição de fluxo de trabalho fornecida para o host como uma versão adicional deve atender aos seguintes requisitos (onde a versão principal é a definição do serviço de fluxo de trabalho é fornecida para o construtor de host). A versão de fluxo de trabalho adicional deverá:

  • Ter o mesmo Name que a versão principal do serviço de fluxo de trabalho.

  • Não deve ter quaisquer atividades Receive ou SendReply no seu Body que não são da versão principal, e eles devem corresponder ao contrato de operação.

  • Ter um único DefinitionIdentity. Somente uma definição de fluxo de trabalho pode ter um nullDefinitionIdentity.

Algumas alterações são permitidas. Os itens a seguir podem ser diferentes entre as versões:

Configurando a DefinitionIdentity

Quando um serviço de fluxo de trabalho é criado usando o designer de fluxo de trabalho, a DefinitionIdentity é definida usando a janela Propriedades. Clique fora da atividade de raiz do serviço no designer para selecionar o serviço de fluxo de trabalho e escolha Janela de propriedades no menu Exibir. Selecione WorkflowIdentity na lista suspensa que aparece ao lado da propriedade DefinitionIdentity, expanda e especifique as propriedades WorkflowIdentity desejadas. No exemplo a seguir, a DefinitionIdentity foi configurada com o NameMortgageWorkflow e um Version de 1.0.0.0. Package é opcional e neste exemplo é null.

Screenshot that shows the DefinitionIdentity property.

Quando um serviço de fluxo de trabalho é auto-hospedado, o DefinitionIdentity é configurado quando o serviço de fluxo de trabalho é criado. No exemplo a seguir, o DefinitionIdentity é configurado com os mesmos valores do exemplo anterior, com o NameMortgageWorkflow e um Name de 1.0.0.0.

WorkflowService service = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflow(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
Dim service As New WorkflowService  
With service  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflow  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  

Um DefinitionIdentity não é necessário, embora apenas uma versão do serviço de fluxo de trabalho possa ter um nuloDefinitionIdentity.

Observação

Isso é útil se o serviço foi implantado inicialmente sem um DefinitionIdentity configurado, e uma versão atualizada é criada.

Adicionar uma nova versão a um serviço de fluxo de trabalho hospedado na web

A primeira etapa na configuração de uma nova versão de um serviço de fluxo de trabalho em um serviço hospedado na web é criar uma nova pasta na pasta App_Code com o mesmo nome do arquivo de serviço. Se arquivo xamlx do serviço é chamado de MortgageWorkflow.xamlx, a pasta deve ser nomeada como MortgageWorkflow. Coloque uma cópia do arquivo xamlx original do serviço nesta pasta e renomeie-o para um novo nome, como MortgageWorkflowV1.xamlx. Faça as alterações desejadas no serviço primário, atualize seu DefinitionIdentity e implante o serviço. No exemplo a seguir, o DefinitionIdentity foi atualizado com um Name de MortgageWorkflow e um Version de 2.0.0.0.

Screenshot that shows DefinitionIdentity of WorkflowIdentity.

Quando o serviço for reiniciado, a versão anterior será automaticamente adicionada à coleção SupportedVersions, porque ela está localizada na subpasta App_Code designada. Observe que, se a versão principal do serviço de fluxo de trabalho tiver um nullDefinitionIdentity, as versões anteriores não serão adicionadas. Uma versão pode ter um nullDefinitionIdentity, mas se houver várias versões, a versão principal não deve ser aquela com o nullDefinitionIdentity, senão as versões anteriores não serão adicionadas à coleção SupportedVersions.

Adicionar uma nova versão a um serviço de fluxo de trabalho auto-hospedado

Ao adicionar uma nova versão a um serviço de fluxo de trabalho auto-hospedado, o WorkflowServiceHost é configurado com a versão principal do serviço de fluxo de trabalho, e as versões anteriores devem ser adicionadas explicitamente à coleção SupportedVersions. No exemplo a seguir, um WorkflowServiceHost é configurado com um serviço de fluxo de trabalho principal que usa uma definição de fluxo de trabalho MortgageWorkflowV2 e um serviço de fluxo de trabalho configurado com uma definição de fluxo de trabalho MortgageWorkflowV1 é adicionado à coleção SupportedVersions. Cada serviço de fluxo de trabalho é configurado com um único DefinitionIdentity que reflete a versão da definição de fluxo de trabalho.

// Create the primary version of the workflow service.  
WorkflowService serviceV2 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV2(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(2, 0, 0, 0)  
    }  
};  
  
// Configure the WorkflowServiceHost with the current version  
// of the workflow service. This code requires Administrator  
// privileges to function correctly. If running from Visual  
// Studio, Visual Studio must be run with Administrator privileges.  
WorkflowServiceHost host = new WorkflowServiceHost(serviceV2,
    new Uri("http://localhost:8080/MortgageWorkflowService"));  
  
// Create the previous version of the workflow service.  
WorkflowService serviceV1 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV1(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
  
// Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1);  
'Create the primary version of the workflow service  
Dim serviceV2 As New WorkflowService  
With serviceV2  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV2  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(2, 0, 0, 0) _  
    }  
End With  
  
'Configure the WorkflowServiceHost with the current version  
'of the workflow service. This code requires Administrator  
'privileges to function correctly. If running from Visual  
'Studio, Visual Studio must be run with Administrator privileges.  
  
Dim host As New WorkflowServiceHost(serviceV2, _  
    New Uri("http://localhost:8080/MortgageWorkflowService"))  
  
'Create the previous version of the workflow service.  
Dim serviceV1 As New WorkflowService  
With serviceV1  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV1  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  
  
'Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1)