Partilhar via


Controle de versão lado a lado no WorkflowServiceHost

O WorkflowServiceHost controle de versão lado a lado introduzido 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 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 as instâncias de execução são concluídas 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 WorkflowServiceHosto .

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 associando um WorkflowIdentity com o serviço de fluxo de trabalho. A WorkflowIdentity contém três informações de identificação. Name e Version contêm um nome e um Version e são obrigatórios, e Package é opcional e pode ser usado para especificar uma cadeia de caracteres adicional contendo informações como nome do assembly ou outras informações desejadas. Cada serviço de fluxo de trabalho contido na SupportedVersions coleção deve ter um arquivo WorkflowIdentity. A WorkflowIdentity é único se qualquer uma das suas três propriedades for diferente de outra WorkflowIdentity. A null WorkflowIdentity é um valor permitido para DefinitionIdentity, mas apenas uma versão anterior de um serviço de fluxo de trabalho pode ter um null WorkflowIdentityarquivo .

Importante

A WorkflowIdentity não deve conter nenhuma informação pessoal identificável (PII). WorkflowIdentity é composto por três partes: a Name (String), a Version (Version), e a Package (String). As informações sobre o WorkflowIdentity usado para criar uma instância são emitidas para qualquer serviço de rastreamento configurado em vários pontos diferentes do ciclo de vida da atividade pelo tempo de execução. O WF Tracking não tem nenhum mecanismo para ocultar PII (dados confidenciais do usuário). Portanto, uma WorkflowIdentity instância não deve conter dados de PII, pois eles serão emitidos pelo tempo de execução nos registros de rastreamento e podem ser visíveis para qualquer pessoa 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 atendidas para que um serviço de fluxo de trabalho seja hospedado com o mesmo conjunto de pontos de extremidade e descrição. Se qualquer uma das versões adicionais não atender a essas condições, o WorkflowServiceHost lançará uma exceção quando Open for chamado. Cada definição de fluxo de trabalho fornecida ao host como uma versão adicional deve atender aos seguintes requisitos (onde a versão principal é a definição de serviço de fluxo de trabalho fornecida ao construtor do host). A versão adicional do fluxo de trabalho deve:

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

  • Não deve ter nenhuma Receive ou SendReply atividades em seu Body que não estejam na versão primária, e eles devem corresponder ao contrato de operação.

  • Tenha um único DefinitionIdentity. Uma e apenas uma definição de fluxo de trabalho pode ter um nullDefinitionIdentityarquivo .

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

Configurando o DefinitionIdentity

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

Captura de tela que mostra a propriedade DefinitionIdentity.

Quando um serviço de fluxo de trabalho é auto-hospedado, o DefinitionIdentity é configurado quando o serviço de fluxo de trabalho é construído. No exemplo a seguir, o DefinitionIdentity é configurado com os mesmos valores do exemplo anterior, com o Name MortgageWorkflow e a 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  

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

Nota

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

Adicionando 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 App_Code pasta que tenha o mesmo nome do arquivo de serviço. Se o arquivo do xamlx serviço for chamado MortgageWorkflow.xamlx, a pasta deverá ser nomeada MortgageWorkflow. Coloque uma cópia do arquivo do serviço xamlx original nessa pasta e renomeie-a para um novo nome, como MortgageWorkflowV1.xamlx. Faça as alterações desejadas no serviço principal, atualize seu DefinitionIdentitye implante o serviço. No exemplo a seguir, o DefinitionIdentity foi atualizado com a Name de MortgageWorkflow e a Version de 2.0.0.0.

Captura de tela que mostra DefinitionIdentity de WorkflowIdentity.

Quando o serviço for reiniciado, a versão anterior será adicionada automaticamente à SupportedVersions coleção porque está localizada na subpasta designada App_Code . Observe que, se a versão principal do serviço de fluxo de trabalho tiver um null DefinitionIdentity , 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 a versão com o nullDefinitionIdentity ou então as versões anteriores não serão adicionadas à SupportedVersions coleção.

Adicionando 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 primária do serviço de fluxo de trabalho e as versões anteriores devem ser explicitamente adicionadas à SupportedVersions coleção. No exemplo a seguir, um WorkflowServiceHost é configurado com um serviço de fluxo de trabalho primário que usa uma MortgageWorkflowV2 definição de fluxo de trabalho e um serviço de fluxo de trabalho configurado com uma MortgageWorkflowV1 definição de fluxo de trabalho é adicionado à SupportedVersions coleção. Cada serviço de fluxo de trabalho é configurado com um exclusivo 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)