Verwenden von WorkflowIdentity und Versionsverwaltung

WorkflowIdentity bietet Entwicklern von Workflowanwendungen die Möglichkeit, einer Workflowdefinition einen Namen und eine Version zuzuweisen und diese Informationen einer persistenten Workflowinstanz zuzuordnen. 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. Dieses Thema bietet eine Übersicht über die Verwendung von WorkflowIdentity mit WorkflowApplication-Hosting. Informationen zur parallelen Ausführung von Workflowdefinitionen in einem Workflowdienst finden Sie unter Parallele Versionsverwaltung in WorkflowServiceHost. Informationen zur dynamischen Aktualisierung finden Sie unter Dynamisches Update.

In diesem Thema

Verwenden von WorkflowIdentity

Um WorkflowIdentity zu verwenden, erstellen Sie eine Instanz, konfigurieren diese und ordnen sie einer WorkflowApplication-Instanz zu. Eine WorkflowIdentity-Instanz enthält drei identifizierende Informationen. 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. WorkflowIdentity ist eindeutig, wenn jede ihrer drei Eigenschaften sich von einer anderen WorkflowIdentity unterscheidet.

Wichtig

WorkflowIdentity sollte keine persönlich identifizierbaren Informationen (PII) enthalten. 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. Die WF-Nachverfolgung besitzt keinen Mechanismus, um PII (vertrauliche Benutzerdaten) auszublenden. 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.

Im folgenden Beispiel wird WorkflowIdentity erstellt und einer Instanz eines Workflows zugeordnet, der mit einer MortgageWorkflow-Workflowdefinition erstellt wurde.

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.

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. Im folgenden Beispiel wird versucht, die MortgageWorkflow-Instanz zu laden, die im vorherigen Beispiel persistent gespeichert wurde. Dieser Ladeversuch wird mithilfe einer WorkflowIdentity ausgeführt, die für eine neuere Version des Hypothekenworkflows konfiguriert wurde, die nicht der persistenten Instanz entspricht.

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.

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 mit WorkflowIdentity

WorkflowIdentity kann verwendet werden, um die parallele Ausführung mehrerer Workflowversionen zu erleichtern. Ein häufiges Szenario besteht darin, die Geschäftsanforderungen in einem Workflow mit langer Laufzeit zu ändern. Bei der Bereitstellung einer aktualisierten Version können viele Instanzen eines Workflows ausgeführt werden. 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. WorkflowIdentity kann verwendet werden, um beim Fortsetzen von Workflowinstanzen die entsprechende Workflowdefinition zu identifizieren und bereitzustellen.

Um die WorkflowIdentity einer persistenten Workflowinstanz abzurufen, wird die GetInstance-Methode verwendet. Die GetInstance-Methode verwendet die Id der persistenten Workflowinstanz und den SqlWorkflowInstanceStore, der die persistente Instanz enthält und WorkflowApplicationInstance zurückgibt. WorkflowApplicationInstance enthält Informationen über eine persistente Workflowinstanz, einschließlich der zugeordneten WorkflowIdentity. Diese zugeordnete WorkflowIdentity kann vom Host verwendet werden, um die richtige Workflowdefinition bereitzustellen, wenn die Workflowinstanz geladen und fortgesetzt wird.

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. Dieses Szenario kann auftreten, wenn eine Workflowanwendung ursprünglich nicht mit Workflowversionsverwaltung geschrieben wurde, oder wenn für eine Anwendung ein Upgrade von .NET Framework 4 durchgeführt wird. Weitere Informationen finden Sie unter Aktualisieren von .NET Framework 4-Persistenzdatenbanken zur Unterstützung der Workflowversionsverwaltung.

Im folgenden Beispiel wird Dictionary<WorkflowIdentity, Activity> verwendet, um WorkflowIdentity-Instanzen die entsprechenden Workflowdefinitionen zuzuordnen, und ein Workflow wird mithilfe der MortgageWorkflow-Workflowdefinition gestartet, die der WorkflowIdentityidentityV1 zugeordnet ist.

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. Diese Informationen werden verwendet, um WorkflowApplication zu konfigurieren. Der Workflow wird daraufhin geladen. 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.

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.

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

Es wird ein Datenbankskript „SqlWorkflowInstanceStoreSchemaUpgrade.sql“ bereitgestellt, um ein Upgrade für Persistenzdatenbanken durchzuführen, die mit .NET Framework 4-Datenbankskripts erstellt wurden. Dieses Skript aktualisiert die Datenbanken, um die neuen Funktionen zur Versionsverwaltung zu unterstützen, die mit .NET Framework 4.5 eingeführt wurden. Den persistenten Workflowinstanzen in den Datenbanken werden Standardversionswerte zugeordnet, und sie können an einer parallelen Ausführung und an dynamischen Updates beteiligt sein.

Wenn eine .NET Framework 4.5-Workflowanwendung versucht, einen beliebigen Persistenzvorgang auszuführen, der die neuen Versionsverwaltungsfunktionen für eine Persistenzdatenbank verwendet, die nicht mithilfe des bereitgestellten Skripts aktualisiert wurde, wird eine InstancePersistenceCommandException ähnlich der folgenden Meldung ausgelöst.

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 Datenbankschema

  1. Öffnen Sie SQL Server Management Studio, und stellen Sie eine Verbindung mit dem Persistenzdatenbankserver her, z. B. .\SQLEXPRESS.

  2. Wählen Sie im Menü Datei die Optionen Öffnen > Datei aus. Wechseln Sie zum folgenden Ordner: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Wählen Sie SqlWorkflowInstanceStoreSchemaUpgrade.sql aus, und klicken Sie auf Öffnen.

  4. Wählen Sie den Namen der Persistenzdatenbank in der Dropdownliste Verfügbare Datenbanken aus.

  5. Wählen Sie im Menü Abfrage die Option Ausführen aus.

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. Erweitern Sie Ihre Persistenzdatenbank im Knoten Datenbanken des Objekt-Explorers, und erweitern Sie dann den Knoten Ansichten. Klicken Sie mit der rechten Maustaste auf System.Activities.DurableInstancing.Instances, und wählen Sie Erste 1000 Zeilen auswählen aus. Scrollen Sie zum Ende der Spalten, und beachten Sie, dass der Ansicht sechs weitere Spalten hinzugefügt wurden: IdentityName, IdentityPackage, Build, Major, Minor und Revision. Alle persistenten Workflows weisen für diese Felder den Wert NULL auf, was auf eine leere Workflowidentität hinweist.