Verwenden von WorkflowIdentity und VersionsverwaltungUsing WorkflowIdentity and Versioning

WorkflowIdentity bietet Entwicklern von Workflowanwendungen die Möglichkeit, einer Workflowdefinition einen Namen und eine Version zuzuweisen und diese Informationen einer persistenten Workflowinstanz zuzuordnen.WorkflowIdentity provides a way for workflow application developers to associate a name and a Version with a workflow definition, and for this information to be associated with a persisted workflow instance. Entwickler von Workflowanwendungen können diese Identitätsinformationen verwenden, um Szenarien wie die parallele Ausführung mehrerer Versionen einer Workflowdefinition umzusetzen. Darüber hinaus bilden sie die Grundlage für andere Funktionen wie dynamische Updates.This identity information can be used by workflow application developers to enable scenarios such as side-by-side execution of multiple versions of a workflow definition, and provides the cornerstone for other functionality such as dynamic update. Dieses Thema bietet eine Übersicht über die Verwendung von WorkflowIdentity mit WorkflowApplication-Hosting.This topic provides as overview of using WorkflowIdentity with WorkflowApplication hosting. Informationen zur parallelen Ausführung von Workflow Definitionen in einem Workflow Dienst finden Sie unter parallele Versionsverwaltung inWorkflow Service Host.For information on side-by-side execution of workflow definitions in a workflow service, see Side by Side Versioning in WorkflowServiceHost. Weitere Informationen zum dynamischen Update finden Sie unter dynamisches Update.For information on dynamic update, see Dynamic Update.

In diesem ThemaIn this topic

Verwenden von workflowidentityUsing WorkflowIdentity

Um WorkflowIdentity zu verwenden, erstellen Sie eine Instanz, konfigurieren diese und ordnen sie einer WorkflowApplication-Instanz zu.To use WorkflowIdentity, create an instance, configure it, and associate it with a WorkflowApplication instance. Eine WorkflowIdentity-Instanz enthält drei identifizierende Informationen.A WorkflowIdentity instance contains three identifying pieces of information. Name und Version enthalten einen Namen und eine Version und sind erforderlich. Package ist optional und kann verwendet werden, um eine zusätzliche Zeichenfolge anzugeben, die Informationen wie den Assemblynamen oder andere gewünschte Informationen enthält.Name and Version contain a name and a Version and are required, and Package is optional and can be used to specify an additional string containing information such as assembly name or other desired information. WorkflowIdentity ist eindeutig, wenn jede ihrer drei Eigenschaften sich von einer anderen WorkflowIdentity unterscheidet.A WorkflowIdentity is unique if any of its three properties are different from another WorkflowIdentity.

Wichtig

WorkflowIdentity sollte keine persönlich identifizierbaren Informationen (PII) enthalten.A WorkflowIdentity should not contain any personally identifiable information (PII). Informationen über die WorkflowIdentity-Aktivität, mit der eine Instanz erstellt wird, werden von der Laufzeit zu verschiedenen Zeiten des Aktivitätslebenszyklus an alle konfigurierten Überwachungsdienste ausgegeben.Information about the WorkflowIdentity used to create an instance is emitted to any configured tracking services at several different points of the activity life-cycle by the runtime. Die WF-Nachverfolgung besitzt keinen Mechanismus, um PII (vertrauliche Benutzerdaten) auszublenden.WF Tracking does not have any mechanism to hide PII (sensitive user data). Daher sollte eine WorkflowIdentity-Instanz keine PII-Daten enthalten, die möglicherweise von der Laufzeit in die Überwachungsdatensätze ausgegeben werden und so für jede Person mit Anzeigerechten für Überwachungsdatensätze sichtbar sind.Therefore, a WorkflowIdentity instance should not contain any PII data as it will be emitted by the runtime in tracking records and may be visible to anyone with access to view the tracking records.

Im folgenden Beispiel wird WorkflowIdentity erstellt und einer Instanz eines Workflows zugeordnet, der mit einer MortgageWorkflow-Workflowdefinition erstellt wurde.In the following example, a WorkflowIdentity is created and associated with an instance of a workflow created using a MortgageWorkflow workflow definition.

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

Beim erneuten Laden und Fortsetzen eines Workflows muss eine WorkflowIdentity verwendet werden, die in Übereinstimmung mit der WorkflowIdentity der persistenten Workflowinstanz konfiguriert ist.When reloading and resuming a workflow, a WorkflowIdentity that is configured to match the WorkflowIdentity of the persisted workflow instance must be used.

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

Wenn die beim erneuten Laden der Workflowinstanz verwendete WorkflowIdentity nicht mit der persistenten WorkflowIdentity übereinstimmt, wird VersionMismatchException ausgelöst.If the WorkflowIdentity used when reloading the workflow instance does not match the persisted WorkflowIdentity, a VersionMismatchException is thrown. Im folgenden Beispiel wird versucht, die MortgageWorkflow-Instanz zu laden, die im vorherigen Beispiel persistent gespeichert wurde.In the following example a load attempt is made on the MortgageWorkflow instance that was persisted in the previous example. Dieser Ladeversuch wird mithilfe einer WorkflowIdentity ausgeführt, die für eine neuere Version des Hypothekenworkflows konfiguriert wurde, die nicht der persistenten Instanz entspricht.This load attempt is made using a WorkflowIdentity configured for a newer version of the mortgage workflow that does not match the persisted instance.

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

Beim Ausführen des vorangehenden Codes wird folgende VersionMismatchException ausgelöst.When the previous code is executed, the following VersionMismatchException is thrown.

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.

Parallele Ausführung mithilfe von workflowidentitySide-by-side Execution using WorkflowIdentity

WorkflowIdentity kann verwendet werden, um die parallele Ausführung mehrerer Workflowversionen zu erleichtern.WorkflowIdentity can be used to facilitate the execution of multiple versions of a workflow side-by-side. Ein häufiges Szenario besteht darin, die Geschäftsanforderungen in einem Workflow mit langer Laufzeit zu ändern.One common scenario is changing business requirements on a long-running workflow. Bei der Bereitstellung einer aktualisierten Version können viele Instanzen eines Workflows ausgeführt werden.Many instances of a workflow could be running when an updated version is deployed. Die Hostanwendung kann so konfiguriert werden, dass die aktualisierte Workflowdefinition beim Starten neuer Instanzen verwendet wird, und sie muss dafür sorgen, beim Fortsetzen von Instanzen die richtige Workflowdefinition bereitzustellen.The host application can be configured to use the updated workflow definition when starting new instances, and it is the responsibility of the host application to provide the correct workflow definition when resuming instances. WorkflowIdentity kann verwendet werden, um beim Fortsetzen von Workflowinstanzen die entsprechende Workflowdefinition zu identifizieren und bereitzustellen.WorkflowIdentity can be used to identify and supply the matching workflow definition when resuming workflow instances.

Um die WorkflowIdentity einer persistenten Workflowinstanz abzurufen, wird die GetInstance-Methode verwendet.To retrieve the WorkflowIdentity of a persisted workflow instance, the GetInstance method is used. Die GetInstance-Methode verwendet die Id der persistenten Workflowinstanz und den SqlWorkflowInstanceStore, der die persistente Instanz enthält und WorkflowApplicationInstance zurückgibt.The GetInstance method takes the Id of the persisted workflow instance and the SqlWorkflowInstanceStore that contains the persisted instance and returns a WorkflowApplicationInstance. WorkflowApplicationInstance enthält Informationen über eine persistente Workflowinstanz, einschließlich der zugeordneten WorkflowIdentity.A WorkflowApplicationInstance contains information about a persisted workflow instance, including its associated WorkflowIdentity. Diese zugeordnete WorkflowIdentity kann vom Host verwendet werden, um die richtige Workflowdefinition bereitzustellen, wenn die Workflowinstanz geladen und fortgesetzt wird.This associated WorkflowIdentity can be used by the host to supply the correct workflow definition when loading and resuming the workflow instance.

Hinweis

Eine leere WorkflowIdentity ist gültig und kann vom Host verwendet werden, um Instanzen, die ohne zugeordnete WorkflowIdentity gespeichert wurden, der richtigen Workflowdefinition zuzuordnen.A null WorkflowIdentity is valid, and can be used by the host to map instances that were persisted with no associated WorkflowIdentity to the proper workflow definition. Dieses Szenario tritt auf, wenn eine Workflowanwendung zunächst ohne Workflowversionsverwaltung geschrieben wurde oder wenn eine Anwendung von .NET Framework 4.NET Framework 4 aktualisiert wird.This scenario can occur when a workflow application was not initially written with workflow versioning, or when an application is upgraded from .NET Framework 4.NET Framework 4. Weitere Informationen finden Sie unter Aktualisieren von .NET Framework 4-Persistenzdatenbanken zur Unterstützung der Workflow VersionsVerwaltung.For more information, see Upgrading .NET Framework 4 Persistence Databases to Support Workflow Versioning.

Im folgenden Beispiel wird ein Dictionary<WorkflowIdentity, Activity> verwendet, um- WorkflowIdentity Instanzen den entsprechenden Workflow Definitionen zuzuordnen, und ein Workflow wird mithilfe der MortgageWorkflow Workflow Definition gestartet, die dem identityV1 WorkflowIdentity.In the following example a Dictionary<WorkflowIdentity, Activity> is used to associate WorkflowIdentity instances with their matching workflow definitions, and a workflow is started using the MortgageWorkflow workflow definition, which is associated with the identityV1 WorkflowIdentity.

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

Im folgenden Beispiel werden Informationen über die persistente Workflowinstanz aus dem vorherigen Beispiel abgerufen, indem GetInstance aufgerufen wird, und die persistenten WorkflowIdentity-Informationen werden verwendet, um die entsprechende Workflowdefinition abzurufen.In the following example, information about the persisted workflow instance from the previous example is retrieved by calling GetInstance, and the persisted WorkflowIdentity information is used to retrieve the matching workflow definition. Diese Informationen werden verwendet, um WorkflowApplication zu konfigurieren. Der Workflow wird daraufhin geladen.This information is used to configure the WorkflowApplication, and then the workflow is loaded. Da die Load-Überladung, die WorkflowApplicationInstance annimmt, verwendet wird, wird von SqlWorkflowInstanceStore der für WorkflowApplicationInstance konfigurierte WorkflowApplication verwendet, sodass die zugehörige InstanceStore-Eigenschaft nicht konfiguriert werden muss.Note that because the Load overload that takes the WorkflowApplicationInstance is used, the SqlWorkflowInstanceStore that was configured on the WorkflowApplicationInstance is used by the WorkflowApplication and therefore its InstanceStore property does not need to be configured.

Hinweis

Wenn die InstanceStore-Eigenschaft festgelegt wird, muss sie mit derselben SqlWorkflowInstanceStore-Instanz festgelegt werden, die von WorkflowApplicationInstance verwendet wird, da andernfalls ArgumentException mit der folgenden Meldung ausgelöst wird: The instance is configured with a different InstanceStore than this WorkflowApplication.If the InstanceStore property is set, it must be set with the same SqlWorkflowInstanceStore instance used by the WorkflowApplicationInstance or else an ArgumentException will be thrown with the following message: 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...

Aktualisieren von .NET Framework 4 Persistenzdatenbanken zur Unterstützung der Workflow VersionsverwaltungUpgrading .NET Framework 4 Persistence Databases to Support Workflow Versioning

Ein SqlWorkflowInstanceStoreSchemaUpgrade.sql-Datenbankskript wird bereitgestellt, um ein Upgrade für Persistenzdatenbanken auszuführen, die mit .NET Framework 4.NET Framework 4-Datenbankskripts erstellt wurden.A SqlWorkflowInstanceStoreSchemaUpgrade.sql database script is provided to upgrade persistence databases created using the .NET Framework 4.NET Framework 4 database scripts. Dieses Skript aktualisiert die Datenbanken, um die neuen Versions Verwaltungsfunktionen zu unterstützen, die in .NET Framework 4,5 eingeführt wurden.This script updates the databases to support the new versioning capabilities introduced in .NET Framework 4.5. Den persistenten Workflowinstanzen in den Datenbanken werden Standardversionswerte zugeordnet, und sie können an einer parallelen Ausführung und an dynamischen Updates beteiligt sein.Any persisted workflow instances in the databases are given default versioning values, and can then participate in side-by-side execution and dynamic update.

Wenn eine .NET Framework 4,5-Workflow Anwendung alle Persistenzvorgänge versucht, die die neuen Versions Verwaltungsfunktionen für eine Persistenzdatenbank verwenden, die nicht mit dem InstancePersistenceCommandException bereitgestellten Skript aktualisiert wurde, wird eine mit einer Meldung ähnlich der folgende Meldung wird angezeigt.If a .NET Framework 4.5 workflow application attempts any persistence operations that use the new versioning features on a persistence database which has not been upgraded using the provided script, an InstancePersistenceCommandException is thrown with a message similar to the following message.

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

So aktualisieren Sie das DatenbankschemaTo upgrade the database schema

  1. Öffnen Sie SQL Server Management Studio, und stellen Sie eine Verbindung mit dem persistenzdatenbankserver her, z.b. .\sqlexpressOpen SQL Server Management Studio and connect to the persistence database server, for example .\SQLEXPRESS.

  2. Wählen Sie im Menü Datei die Option Öffnenund dann Datei aus.Choose Open, File from the File menu. Wechseln Sie zum folgenden Ordner: C:\Windows\Microsoft.NET\Framework\4.0.30319\sql\enBrowse to the following folder: C:\Windows\Microsoft.NET\Framework\4.0.30319\sql\en

  3. Wählen Sie sqlworkflowinstancestoreschemaupgrade. SQL aus, und klicken Sie auf Öffnen.Select SqlWorkflowInstanceStoreSchemaUpgrade.sql and click Open.

  4. Wählen Sie den Namen der Persistenzdatenbank in der Dropdown-Option Verfügbare Datenbanken aus.Select the name of the persistence database in the Available Databases drop-down.

  5. Wählen Sie im Menü Abfrage die Option Ausführen aus.Choose Execute from the Query menu.

Sobald die Abfrage abgeschlossen ist, wird das Datenbankschema aktualisiert. Sie können jetzt die standardmäßige Workflowidentität anzeigen, die den persistenten Workflowinstanzen zugewiesen wurde.When the query completes, the database schema is upgraded, and if desired, you can view the default workflow identity that was assigned to the persisted workflow instances. Erweitern Sie die Persistenzdatenbank im Knoten Datenbanken des Objekt-Explorer, und erweitern Sie dann den Knoten Sichten .Expand your persistence database in the Databases node of the Object Explorer, and then expand the Views node. Klicken Sie mit der rechten Maustaste auf System. Activities. DurableInstancing. Instanzen , und wählen Sie oberste 1000 Zeilen auswählenaus.Right-click System.Activities.DurableInstancing.Instances and choose Select Top 1000 Rows. Scrollen Sie zum Ende der Spalten, und beachten Sie, dass der Sicht sechs weitere Spalten hinzugefügt werden: IdentityName, identitypackage, Build, Major, Minorund Revision.Scroll to end of the columns and note that there are six additional columns added to the view: IdentityName, IdentityPackage, Build, Major, Minor, and Revision. Alle beibehaltenen Workflows weisen für diese Felder den Wert null auf, der eine NULL-Workflow Identität darstellt.Any persisted workflows will have a value of NULL for these fields, representing a null workflow identity.