Delen via


WorkflowIdentity en versiebeheer gebruiken

WorkflowIdentity biedt ontwikkelaars van werkstroomtoepassingen een manier om een naam en een Version naam te koppelen aan een werkstroomdefinitie en om deze informatie te koppelen aan een persistent werkstroomexemplaar. Deze identiteitsgegevens kunnen door ontwikkelaars van werkstroomtoepassingen worden gebruikt om scenario's mogelijk te maken, zoals het naast elkaar uitvoeren van meerdere versies van een werkstroomdefinitie, en biedt de hoeksteen voor andere functionaliteit, zoals dynamische updates. Dit onderwerp biedt een overzicht van het gebruik van WorkflowIdentityWorkflowApplication hosting. Zie Side by Side Versioning in WorkflowServiceHost voor informatie over het naast elkaar uitvoeren van werkstroomdefinities in een werkstroomservice. Zie Dynamische update voor meer informatie over dynamische updates.

In dit onderwerp

WorkflowIdentity gebruiken

Als u een exemplaar wilt gebruiken WorkflowIdentity, maakt u een exemplaar, configureert u het en koppelt u het aan een WorkflowApplication exemplaar. Een WorkflowIdentity exemplaar bevat drie identificerende stukjes informatie. 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. Een WorkflowIdentity is uniek als een van de drie eigenschappen verschilt van een andere WorkflowIdentity.

Belangrijk

A WorkflowIdentity mag geen persoonsgegevens bevatten. 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.

In het volgende voorbeeld wordt een WorkflowIdentity werkstroom gemaakt en gekoppeld aan een exemplaar van een werkstroom dat is gemaakt met behulp van een MortgageWorkflow werkstroomdefinitie.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Wanneer u een werkstroom opnieuw laadt en hervat, moet een WorkflowIdentity werkstroom die is geconfigureerd om overeen te komen met het WorkflowIdentity persistente werkstroomexemplaren worden gebruikt.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

Als het WorkflowIdentity wordt gebruikt bij het opnieuw laden van het werkstroomexemplaren niet overeenkomt met het persistente WorkflowIdentityexemplaar, wordt er een VersionMismatchException gegenereerd. In het volgende voorbeeld wordt een laadpoging uitgevoerd op het MortgageWorkflow exemplaar dat in het vorige voorbeeld is behouden. Deze laadpoging wordt uitgevoerd met behulp van een WorkflowIdentity geconfigureerde versie voor een nieuwere versie van de hypotheekwerkstroom die niet overeenkomt met het persistente exemplaar.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

Wanneer de vorige code wordt uitgevoerd, wordt het volgende VersionMismatchException gegenereerd.

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

Uitvoering naast elkaar met behulp van WorkflowIdentity

WorkflowIdentity kan worden gebruikt om de uitvoering van meerdere versies van een werkstroom naast elkaar te vergemakkelijken. Een veelvoorkomend scenario is het wijzigen van bedrijfsvereisten voor een langlopende werkstroom. Veel exemplaren van een werkstroom kunnen worden uitgevoerd wanneer een bijgewerkte versie wordt geïmplementeerd. De hosttoepassing kan worden geconfigureerd voor het gebruik van de bijgewerkte werkstroomdefinitie bij het starten van nieuwe exemplaren en het is de verantwoordelijkheid van de hosttoepassing om de juiste werkstroomdefinitie te bieden bij het hervatten van exemplaren. WorkflowIdentity kan worden gebruikt om de overeenkomende werkstroomdefinitie te identificeren en op te geven bij het hervatten van werkstroomexemplaren.

Voor het ophalen van een WorkflowIdentity persistent werkstroomexemplaren wordt de GetInstance methode gebruikt. De GetInstance methode gebruikt het Id persistente werkstroomexemplaren en de SqlWorkflowInstanceStore instantie die het persistente exemplaar bevat en retourneert een WorkflowApplicationInstance. Een WorkflowApplicationInstance bevat informatie over een persistent werkstroomexemplaar, inclusief de bijbehorende WorkflowIdentity. Dit kan WorkflowIdentity worden gebruikt door de host om de juiste werkstroomdefinitie op te geven bij het laden en hervatten van het werkstroomexemplaar.

Notitie

Een null WorkflowIdentity is geldig en kan door de host worden gebruikt om exemplaren toe te wijzen die niet zijn gekoppeld aan WorkflowIdentity de juiste werkstroomdefinitie. Dit scenario kan optreden wanneer een werkstroomtoepassing niet in eerste instantie is geschreven met werkstroomversiebeheer of wanneer een toepassing wordt bijgewerkt vanuit .NET Framework 4. Zie .NET Framework 4 persistentiedatabases upgraden om werkstroomversiebeheer te ondersteunen voor meer informatie.

In het volgende voorbeeld wordt een Dictionary<WorkflowIdentity, Activity> gebruikt om exemplaren te koppelen WorkflowIdentity aan hun overeenkomende werkstroomdefinities en wordt een werkstroom gestart met behulp van de MortgageWorkflow werkstroomdefinitie, die aan de identityV1WorkflowIdentitywerkstroom is gekoppeld.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

In het volgende voorbeeld wordt informatie over het persistente werkstroomexemplaren uit het vorige voorbeeld opgehaald door aan te roepen GetInstanceen wordt de persistente WorkflowIdentity informatie gebruikt om de overeenkomende werkstroomdefinitie op te halen. Deze informatie wordt gebruikt om de WorkflowApplicationen vervolgens de werkstroom te configureren. Houd er rekening mee dat omdat de Load overbelasting die WorkflowApplicationInstance wordt gebruikt, de SqlWorkflowInstanceStore die op de WorkflowApplicationInstance computer is geconfigureerd, wordt gebruikt door de WorkflowApplication en daarom InstanceStore hoeft de eigenschap niet te worden geconfigureerd.

Notitie

Als de eigenschap is ingesteld, moet deze InstanceStore worden ingesteld met hetzelfde SqlWorkflowInstanceStore exemplaar dat door de WorkflowApplicationInstance of andere instantie wordt gebruikt, wordt er een ArgumentException gegenereerd met het volgende bericht: The instance is configured with a different InstanceStore than this WorkflowApplication.

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

.NET Framework 4 persistentiedatabases upgraden om werkstroomversiebeheer te ondersteunen

Er wordt een SqlWorkflowInstanceStoreSchemaUpgrade.sql databasescript verstrekt voor het upgraden van persistentiedatabases die zijn gemaakt met behulp van de .NET Framework 4-databasescripts. Met dit script worden de databases bijgewerkt ter ondersteuning van de nieuwe versiebeheermogelijkheden die zijn geïntroduceerd in .NET Framework 4.5. Persistente werkstroomexemplaren in de databases krijgen standaardversiebeheerwaarden en kunnen vervolgens deelnemen aan uitvoering naast elkaar en dynamische updates.

Als een .NET Framework 4.5-werkstroomtoepassing persistentiebewerkingen probeert uit te voeren die gebruikmaken van de nieuwe versiebeheerfuncties op een persistentiedatabase die niet is bijgewerkt met behulp van het opgegeven script, wordt er een InstancePersistenceCommandException bericht gegenereerd dat vergelijkbaar is met het volgende bericht.

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

Het databaseschema upgraden

  1. Open SQL Server Management Studio en maak verbinding met de persistentiedatabaseserver, bijvoorbeeld .\SQLEXPRESS.

  2. Kies Openen, Bestand in het menu Bestand . Blader naar de volgende map: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Selecteer SqlWorkflowInstanceStoreSchemaUpgrade.sql en klik op Openen.

  4. Selecteer de naam van de persistentiedatabase in de vervolgkeuzelijst Beschikbare databases .

  5. Kies Uitvoeren in het menu Query .

Wanneer de query is voltooid, wordt het databaseschema bijgewerkt. Desgewenst kunt u de standaardwerkstroomidentiteit bekijken die is toegewezen aan de persistente werkstroomexemplaren. Vouw uw persistentiedatabase uit in het knooppunt Databases van de Objectverkenner en vouw vervolgens het knooppunt Weergaven uit. Klik met de rechtermuisknop op System.Activities.DurableInstancing.Instances en kies Top 1000 rijen selecteren. Schuif naar het einde van de kolommen en houd er rekening mee dat er zes extra kolommen zijn toegevoegd aan de weergave: IdentityName, IdentityPackage, Build, Major, Minor en Revision. Permanente werkstromen hebben een waarde van NULL voor deze velden, die een null-werkstroomidentiteit vertegenwoordigen.