Dela via


Använda WorkflowIdentity och versionshantering

WorkflowIdentity tillhandahåller ett sätt för utvecklare av arbetsflödesprogram att associera ett namn och en Version med en arbetsflödesdefinition, och för att den här informationen ska associeras med en instans av ett beständiga arbetsflöde. Den här identitetsinformationen kan användas av utvecklare av arbetsflödesprogram för att aktivera scenarier, till exempel körning sida vid sida av flera versioner av en arbetsflödesdefinition, och utgör hörnstenen för andra funktioner, till exempel dynamisk uppdatering. Det här avsnittet innehåller en översikt över hur du använder WorkflowIdentity med WorkflowApplication värdtjänster. Information om körning sida vid sida av arbetsflödesdefinitioner i en arbetsflödestjänst finns i Sida vid sida-versionshantering i WorkflowServiceHost. Information om dynamisk uppdatering finns i Dynamisk uppdatering.

I det här avsnittet

Använda WorkflowIdentity

Om du vill använda WorkflowIdentityskapar du en instans, konfigurerar den och associerar den med en WorkflowApplication instans. En WorkflowIdentity instans innehåller tre identifierande informationsdelar. Name och Version innehåller ett namn och ett Version och krävs, och Package är valfritt och kan användas för att ange ytterligare en sträng som innehåller information som sammansättningsnamn eller annan önskad information. A WorkflowIdentity är unikt om någon av dess tre egenskaper skiljer sig från en annan WorkflowIdentity.

Viktigt!

En WorkflowIdentity bör inte innehålla någon personligt identifierbar information (PII). Information om den WorkflowIdentity som används för att skapa en instans skickas till alla konfigurerade spårningstjänster vid flera olika tidpunkter i aktivitetslivscykeln av körningen. WF-spårning har ingen mekanism för att dölja PII (känsliga användardata). Därför bör en WorkflowIdentity instans inte innehålla några PII-data eftersom den genereras av körningen i spårningsposter och kan vara synlig för alla som har åtkomst till att visa spårningsposterna.

I följande exempel skapas och associeras en WorkflowIdentity instans av ett arbetsflöde som skapats med hjälp av en MortgageWorkflow arbetsflödesdefinition.

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();

När du läser in och återupptar ett arbetsflöde igen måste en WorkflowIdentity som är konfigurerad för att matcha den bevarade arbetsflödesinstansen WorkflowIdentity användas.

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...

Om den WorkflowIdentity som används när arbetsflödesinstansen läses in igen inte matchar den bevarade genereras WorkflowIdentityen VersionMismatchException . I följande exempel görs ett inläsningsförsök på den MortgageWorkflow instans som bevarades i föregående exempel. Det här inläsningsförsöket görs med hjälp av en WorkflowIdentity konfigurerad för en nyare version av inteckningsarbetsflödet som inte matchar den bevarade instansen.

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...

När den tidigare koden körs genereras följande VersionMismatchException .

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.

Körning sida vid sida med hjälp av WorkflowIdentity

WorkflowIdentity kan användas för att underlätta körningen av flera versioner av ett arbetsflöde sida vid sida. Ett vanligt scenario är att ändra affärskraven för ett långvarigt arbetsflöde. Många instanser av ett arbetsflöde kan köras när en uppdaterad version distribueras. Värdprogrammet kan konfigureras för att använda den uppdaterade arbetsflödesdefinitionen när nya instanser startas, och det är värdprogrammets ansvar att ange rätt arbetsflödesdefinition när instanser återupptas. WorkflowIdentity kan användas för att identifiera och ange matchande arbetsflödesdefinition när arbetsflödesinstanser återupptas.

Metoden används för att hämta WorkflowIdentity en instans GetInstance av ett beständiga arbetsflöde. Metoden GetInstance tar den Id bevarade arbetsflödesinstansen och den som innehåller den bevarade instansen SqlWorkflowInstanceStore och returnerar en WorkflowApplicationInstance. A WorkflowApplicationInstance innehåller information om en instans av ett beständiga arbetsflöde, inklusive dess associerade WorkflowIdentity. Den här associerade WorkflowIdentity kan användas av värden för att ange rätt arbetsflödesdefinition när arbetsflödesinstansen läses in och återupptas.

Kommentar

En null WorkflowIdentity är giltig och kan användas av värden för att mappa instanser som har sparats utan någon associerad WorkflowIdentity till rätt arbetsflödesdefinition. Det här scenariot kan inträffa när ett arbetsflödesprogram inte ursprungligen skrevs med arbetsflödesversioner eller när ett program uppgraderas från .NET Framework 4. Mer information finns i Uppgradera .NET Framework 4 Persistence Databases to Support Workflow Versionsing (Uppgradera .NET Framework 4 Persistence Databases to Support Workflow Versionsing).

I följande exempel används en Dictionary<WorkflowIdentity, Activity> för att associera WorkflowIdentity instanser med deras matchande arbetsflödesdefinitioner, och ett arbetsflöde startas med hjälp av arbetsflödesdefinitionen MortgageWorkflow identityV1 WorkflowIdentity, som är associerad med .

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();

I följande exempel hämtas information om den bevarade arbetsflödesinstansen från föregående exempel genom att anropa GetInstanceoch den bevarade informationen används för att hämta den matchande arbetsflödesdefinitionen WorkflowIdentity . Den här informationen används för att konfigurera WorkflowApplication, och sedan läses arbetsflödet in. Observera att eftersom överlagringen Load WorkflowApplicationInstance som tar används, används WorkflowApplication den SqlWorkflowInstanceStore som har konfigurerats på WorkflowApplicationInstance och därför behöver dess InstanceStore egenskap inte konfigureras.

Kommentar

Om egenskapen InstanceStore har angetts måste den anges med samma SqlWorkflowInstanceStore instans som används av WorkflowApplicationInstance , annars genereras en ArgumentException med följande meddelande: 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...

Uppgradera .NET Framework 4 Persistence Databases för att stödja versionshantering av arbetsflöden

Ett SqlWorkflowInstanceStoreSchemaUpgrade.sql databasskript tillhandahålls för att uppgradera beständighetsdatabaser som skapats med hjälp av .NET Framework 4-databasskripten. Det här skriptet uppdaterar databaserna för att stödja de nya versionsfunktionerna som introduceras i .NET Framework 4.5. Alla bevarade arbetsflödesinstanser i databaserna får standardvärden för versionshantering och kan sedan delta i körning sida vid sida och dynamisk uppdatering.

Om ett .NET Framework 4.5-arbetsflödesprogram försöker utföra beständighetsåtgärder som använder de nya versionsfunktionerna i en beständig databas som inte har uppgraderats med det angivna skriptet genereras ett InstancePersistenceCommandException meddelande som liknar följande meddelande.

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'.

Uppgradera databasschemat

  1. Öppna SQL Server Management Studio och anslut till databasservern för beständighet, till exempel .\SQLEXPRESS.

  2. Välj Öppna, ArkivArkiv-menyn . Bläddra till följande mapp: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Välj SqlWorkflowInstanceStoreSchemaUpgrade.sql och klicka på Öppna.

  4. Välj namnet på beständighetsdatabasen i listrutan Tillgängliga databaser .

  5. Välj Körmenyn Fråga .

När frågan är klar uppgraderas databasschemat, och om du vill kan du visa den standardarbetsflödesidentitet som tilldelades till de bevarade arbetsflödesinstanserna. Expandera din beständighetsdatabas i noden Databaser i Object Explorer och expandera sedan noden Vyer. Högerklicka på System.Activities.DurableInstancing.Instances och välj Välj de 1 000 översta raderna. Rulla till slutet av kolumnerna och observera att det finns ytterligare sex kolumner i vyn: IdentityName, IdentityPackage, Build, Major, Minor och Revision. Alla bevarade arbetsflöden har värdet NULL för de här fälten, vilket representerar en null-arbetsflödesidentitet.