Delen via


Naast versiebeheer in WorkflowServiceHost

De WorkflowServiceHost naast elkaar geïntroduceerde versiebeheer in .NET Framework 4.5 biedt de mogelijkheid om meerdere versies van een werkstroomservice op één eindpunt te hosten. Met de beschikbare functionaliteit naast elkaar kan een werkstroomservice worden geconfigureerd, zodat nieuwe exemplaren van de werkstroomservice worden gemaakt met behulp van de nieuwe werkstroomdefinitie, terwijl actieve exemplaren zijn voltooid met behulp van de bestaande definitie. In dit onderwerp vindt u een overzicht van de uitvoering van de werkstroomservice naast elkaar met behulp van WorkflowServiceHost.

Meerdere versies hosten in een werkstroomservice

WorkflowServiceHost bevat twee eigenschappen die kunnen worden geconfigureerd om meerdere versies van een werkstroom naast elkaar uit te voeren: SupportedVersions en DefinitionIdentity. SupportedVersions bevat de ondersteunde versies van de werkstroomservice en DefinitionIdentity wordt gebruikt om elke werkstroomservice uniek te identificeren. Dit wordt gedaan door een WorkflowIdentity koppeling te maken met de werkstroomservice. A WorkflowIdentity bevat drie identificatiegegevens. Name en Version een naam en een Version en zijn vereist, en Package is optioneel en kan worden gebruikt om een extra tekenreeks op te geven die informatie bevat, zoals assemblynaam of andere gewenste informatie. Elke werkstroomservice in de SupportedVersions verzameling moet een uniek WorkflowIdentityitem hebben. Een WorkflowIdentity is uniek als een van de drie eigenschappen verschilt van een andere WorkflowIdentity. A nullWorkflowIdentity is een toegestane waarde voor DefinitionIdentity, maar slechts één eerdere versie van een werkstroomservice kan een nullWorkflowIdentity.

Belangrijk

A WorkflowIdentity mag geen persoonsgegevens bevatten. WorkflowIdentity bestaat uit drie delen: a Name (String), een Version (Version) en een Package (String). Informatie over het WorkflowIdentity maken van een exemplaar wordt verzonden naar geconfigureerde traceringsservices op verschillende punten van de levenscyclus van de activiteit door de runtime. WF Tracking heeft geen mechanisme om PII (gevoelige gebruikersgegevens) te verbergen. Daarom mag een WorkflowIdentity exemplaar geen PII-gegevens bevatten, omdat deze door de runtime worden verzonden bij het bijhouden van records en zichtbaar zijn voor iedereen die toegang heeft om de traceringsrecords weer te geven.

Regels voor het hosten van meerdere versies van een werkstroomservice

Wanneer een gebruiker een extra versie toevoegt aan de WorkflowServiceHostservice, zijn er verschillende voorwaarden waaraan moet worden voldaan om een werkstroomservice te kunnen hosten met dezelfde set eindpunten en beschrijvingen. Als een van de aanvullende versies niet aan deze voorwaarden voldoet, wordt er WorkflowServiceHost een uitzondering gegenereerd wanneer Open deze wordt aangeroepen. Elke werkstroomdefinitie die als een extra versie aan de host wordt verstrekt, moet voldoen aan de volgende vereisten (waarbij de primaire versie de definitie van de werkstroomservice is die wordt geleverd aan de hostconstructor). De aanvullende werkstroomversie moet:

  • Name Dezelfde hebben als de primaire versie van de werkstroomservice.

  • Mag geen activiteiten Receive of SendReply activiteiten Body hebben die zich niet in de primaire versie bevinden en moeten overeenkomen met het bewerkingscontract.

  • Een unieke DefinitionIdentity. Een en slechts één werkstroomdefinitie kan een nullDefinitionIdentity.

Sommige wijzigingen zijn toegestaan. De volgende items kunnen verschillen tussen de versies:

De DefinitionIdentity configureren

Wanneer een werkstroomservice wordt gemaakt met de werkstroomontwerper, wordt deze DefinitionIdentity ingesteld met behulp van het venster Eigenschappen . Klik buiten de hoofdactiviteit van de service in de ontwerpfunctie om de werkstroomservice te selecteren en kies Eigenschappenvenster in het menu Beeld . Selecteer WorkflowIdentity in de vervolgkeuzelijst die naast de eigenschap DefinitionIdentity wordt weergegeven en vouw vervolgens de gewenste WorkflowIdentity eigenschappen uit en geef deze op. In het volgende voorbeeld is het DefinitionIdentity geconfigureerd met de NameMortgageWorkflow en een Version van 1.0.0.0. Package is optioneel en in dit voorbeeld is null.

Screenshot that shows the DefinitionIdentity property.

Wanneer een werkstroomservice zelf wordt gehost, wordt deze DefinitionIdentity geconfigureerd wanneer de werkstroomservice wordt samengesteld. In het volgende voorbeeld wordt het DefinitionIdentity geconfigureerd met dezelfde waarden als het vorige voorbeeld, met de NameMortgageWorkflow en een Name van 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  

Een DefinitionIdentity is niet vereist, hoewel slechts één versie van de werkstroomservice een null-waardeDefinitionIdentity kan hebben.

Notitie

Dit is handig als de service in eerste instantie is geïmplementeerd zonder een DefinitionIdentity geconfigureerde en vervolgens een bijgewerkte versie wordt gemaakt.

Een nieuwe versie toevoegen aan een web-hostende werkstroomservice

De eerste stap bij het configureren van een nieuwe versie van een werkstroomservice in een web-hostservice is het maken van een nieuwe map in de App_Code map met dezelfde naam als het servicebestand. Als het bestand van xamlx de service de naam MortgageWorkflow.xamlxheeft, moet de map de naam MortgageWorkflowhebben. Plaats een kopie van het bestand van de oorspronkelijke service xamlx in deze map en wijzig de naam ervan in een nieuwe naam, zoals MortgageWorkflowV1.xamlx. Breng de gewenste wijzigingen aan in de primaire service, werk de bijbehorende service bij DefinitionIdentityen implementeer vervolgens de service. In het volgende voorbeeld is het DefinitionIdentity bijgewerkt met een Name van MortgageWorkflow en een Version van 2.0.0.0.

Screenshot that shows DefinitionIdentity of WorkflowIdentity.

Wanneer de service opnieuw wordt opgestart, wordt de vorige versie automatisch toegevoegd aan de SupportedVersions verzameling omdat deze zich in de aangewezen App_Code submap bevindt. Houd er rekening mee dat als de primaire versie van de werkstroomservice een nullDefinitionIdentity eerdere versie heeft, niet wordt toegevoegd. Een versie kan een nullDefinitionIdentity, maar als er meerdere versies zijn, mag de primaire versie niet de versie zijn met de nullDefinitionIdentity of andere, worden de vorige versies niet toegevoegd aan de SupportedVersions verzameling.

Een nieuwe versie toevoegen aan een zelf-hostende werkstroomservice

Wanneer u een nieuwe versie toevoegt aan een zelf-hostende werkstroomservice, wordt de WorkflowServiceHost versie geconfigureerd met de primaire versie van de werkstroomservice en moeten eerdere versies expliciet aan de SupportedVersions verzameling worden toegevoegd. In het volgende voorbeeld wordt een WorkflowServiceHost geconfigureerd met een primaire werkstroomservice die gebruikmaakt van een MortgageWorkflowV2 werkstroomdefinitie en een werkstroomservice die is geconfigureerd met een MortgageWorkflowV1 werkstroomdefinitie, wordt toegevoegd aan de SupportedVersions verzameling. Elke werkstroomservice is geconfigureerd met een unieke DefinitionIdentity versie van de werkstroomdefinitie.

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