Gestione di più versioni in WorkflowServiceHost

Il controllo delle versioni side-by-side di WorkflowServiceHost introdotto in .NET Framework 4.5 fornisce la possibilità di ospitare più versioni di un servizio di flusso di lavoro in un unico endpoint. La funzionalità side-by-side consente di configurare un servizio di flusso di lavoro in modo che le sue nuove istanze vengano create con la nuova definizione del flusso di lavoro, mentre le istanze in esecuzione vengono completate con la definizione esistente. In questo argomento viene fornita una panoramica dell'esecuzione side-by-side del servizio di flusso di lavoro usando WorkflowServiceHost.

Hosting di più versioni in un servizio di flusso di lavoro

WorkflowServiceHost contiene due proprietà che possono essere configurate per consentire l'esecuzione side-by-side di più versioni di un flusso di lavoro: SupportedVersions e DefinitionIdentity. La proprietà SupportedVersions contiene le versioni supportate del servizio di flusso di lavoro e la proprietà DefinitionIdentity viene usata per identificare in modo univoco ogni servizio di flusso di lavoro. Questa operazione viene effettuata associando un oggetto WorkflowIdentity al servizio di flusso di lavoro. WorkflowIdentity contiene tre informazioni di identificazione. Le proprietà Name e Version contengono un nome e un oggetto Version e sono obbligatorie, mentre la proprietà Package è facoltativa e può essere usata per specificare una stringa aggiuntiva che contiene informazioni quali il nome dell'assembly o altre informazioni desiderate. A ogni servizio di flusso di lavoro contenuto nella raccolta SupportedVersions deve essere associato un oggetto WorkflowIdentity univoco. Un oggetto WorkflowIdentity è univoco se una qualsiasi delle tre relative proprietà è diversa da un altro oggetto WorkflowIdentity. Un oggetto nullWorkflowIdentity  è un valore consentito per DefinitionIdentity, tuttavia solo una versione precedente di un servizio di flusso di lavoro può avere  nullWorkflowIdentity.

Importante

WorkflowIdentity non deve contenere eventuali informazioni identificabili personalmente (PII). WorkflowIdentity si compone di tre parti: Name (String), Version (Version) e Package (String). Le informazioni su WorkflowIdentity usate per creare un'istanza vengono generate a tutti i servizi di rilevamento configurati in vari punti del ciclo di vita di attività dal runtime. La verifica di WF non ha alcun meccanismo per nascondere i PII (dati riservati dell'utente). Di conseguenza, un'istanza di WorkflowIdentity non deve contenere dati di PII poiché verrebbe generata dal runtime nei record di rilevamento e può essere visibile agli utenti con accesso alla visualizzazione dei record di rilevamento.

Regole per l'hosting di più versioni di un servizio di flusso di lavoro

Quando un utente aggiunge un'ulteriore versione a WorkflowServiceHost, è necessario soddisfare diverse condizioni affinché un servizio di flusso di lavoro possa essere ospitato con lo stesso set di endpoint e la medesima descrizione. Se una delle versioni aggiuntive non soddisfa queste condizioni, WorkflowServiceHost genera un'eccezione quando viene chiamato Open. Ogni definizione di flusso di lavoro fornita all'host come versione aggiuntiva deve soddisfare i requisiti seguenti (dove la versione principale è la definizione del servizio di flusso di lavoro fornita al costruttore host). La versione aggiuntiva del flusso di lavoro deve soddisfare i requisiti seguenti:

  • Disporre della stessa proprietà Name della versione principale del servizio di flusso di lavoro.

  • Non disporre di alcuna attività Receive o SendReply in Body che non sia presente anche nella versione principale e, nel caso, tali attività devono corrispondere al contratto dell'operazione.

  • Disporre di una proprietà DefinitionIdentity univoca. Una sola definizione di flusso di lavoro può avere nullDefinitionIdentity.

Alcune modifiche sono consentite. Gli elementi seguenti possono essere diversi tra una versione e l'altra:

Configurazione di DefinitionIdentity

Quando un servizio di flusso di lavoro viene creato usando Progettazione flussi di lavoro, la proprietà DefinitionIdentity viene impostata nella finestra Proprietà. Fare clic all'esterno dell'attività radice del servizio nella finestra di progettazione per selezionare il servizio di flusso di lavoro e scegliere Finestra Proprietà nel menu Visualizza. Selezionare WorkflowIdentity nell'elenco a discesa visualizzato accanto alla proprietà DefinitionIdentity, quindi espandere e specificare le proprietà WorkflowIdentity desiderate. Nell'esempio seguente la proprietà DefinitionIdentity è configurata con la proprietà NameMortgageWorkflow  e la proprietà Version di 1.0.0.0. La proprietà Package è facoltativa e in questo esempio è null.

Screenshot that shows the DefinitionIdentity property.

Quando un servizio di flusso di lavoro è self-hosted, la proprietà DefinitionIdentity viene configurata quando il servizio di flusso di lavoro viene costruito. Nell'esempio seguente, la proprietà DefinitionIdentity viene configurata con gli stessi valori dell'esempio precedente, cioè con la proprietà NameMortgageWorkflow  e la proprietà Name di 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  

La proprietà DefinitionIdentity non è necessaria, anche se solo una versione del servizio di flusso di lavoro può avere nullDefinitionIdentity.

Nota

Questa condizione è utile se il servizio è stato distribuito inizialmente senza una proprietà DefinitionIdentity configurata e, successivamente, viene creata una versione aggiornata.

Aggiunta di una nuova versione a un servizio di flusso di lavoro ospitato sul Web

Il primo passaggio della configurazione di una nuova versione di un servizio di flusso di lavoro in un servizio ospitato sul Web consiste nel creare una nuova cartella nella cartella App_Code, denominandola come il file del servizio. Se il file xamlx del servizio è denominato MortgageWorkflow.xamlx, la cartella deve essere denominata MortgageWorkflow. Inserire una copia del file xamlx del servizio originale in questa cartella e assegnarle un nuovo nome, ad esempio MortgageWorkflowV1.xamlx. Apportare le modifiche desiderate al servizio principale, aggiornare la relativa proprietà DefinitionIdentity, quindi distribuire il servizio. Nell'esempio seguente, la proprietà DefinitionIdentity è stata aggiornata con la proprietà NameMortgageWorkflow e la proprietà Version2.0.0.0.

Screenshot that shows DefinitionIdentity of WorkflowIdentity.

Quando il servizio viene riavviato, la versione precedente verrà aggiunta automaticamente alla raccolta SupportedVersions poiché si trova nella sottocartella App_Code designata. Si noti che se la versione principale del servizio di flusso di lavoro ha una proprietà nullDefinitionIdentity, le versioni precedenti non verranno aggiunte. Una versione può avere una proprietà nullDefinitionIdentity, tuttavia se sono presenti più versioni, la versione principale non deve essere quella con la proprietà nullDefinitionIdentity, altrimenti le versioni precedenti non verranno aggiunte alla raccolta SupportedVersions.

Aggiunta di una nuova versione a un servizio di flusso di lavoro self-hosted

Quando si aggiunge una nuova versione a un servizio di flusso di lavoro self-hosted, l'oggetto WorkflowServiceHost viene configurato con la versione principale del servizio di flusso di lavoro e le versioni precedenti devono essere aggiunte in modo esplicito alla raccolta SupportedVersions. Nell'esempio seguente un oggetto WorkflowServiceHost viene configurato con un servizio di flusso di lavoro principale che usa una definizione del flusso di lavoro MortgageWorkflowV2 e un servizio di flusso di lavoro configurato con una definizione del flusso di lavoro MortgageWorkflowV1 viene aggiunto alla raccolta SupportedVersions. Ogni servizio di flusso di lavoro è configurato con una proprietà DefinitionIdentity univoca che riflette la versione della definizione del flusso di lavoro.

// 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)