Parallele Versionsverwaltung in WorkflowServiceHost

Die parallele Versionsverwaltung in WorkflowServiceHost, die in .NET Framework 4.5 eingeführt wurde, ermöglicht das Hosten mehrerer Versionen eines Workflowdiensts in einem einzigen Endpunkt. Mit der parallelen Funktionalität lässt sich ein Workflowdienst so konfigurieren, dass neue Instanzen des Workflowdiensts mithilfe der neuen Workflowdefinition erstellt werden, während gegenwärtig ausgeführte Instanzen auf Grundlage der vorhandenen Definition abgeschlossen werden. Dieses Thema bietet eine Übersicht über die parallele Ausführung des Workflowdiensts mit WorkflowServiceHost.

Hosten mehrerer Versionen in einem Workflowdienst

WorkflowServiceHost enthält zwei Eigenschaften, die so konfiguriert werden können, dass mehrere Versionen eines Workflows parallel ausgeführt werden: SupportedVersions und DefinitionIdentity. SupportedVersions enthält die unterstützten Versionen des Workflowdiensts, und mit DefinitionIdentity lassen sich die einzelnen Workflowdienste eindeutig identifizieren. Dazu wird dem Workflowdienst eine WorkflowIdentity zugeordnet. Eine WorkflowIdentity enthält drei Identifizierungsinformationen. 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. Jeder Workflowdienst in der SupportedVersions-Auflistung muss über eine eindeutige WorkflowIdentity verfügen. WorkflowIdentity ist eindeutig, wenn jede ihrer drei Eigenschaften sich von einer anderen WorkflowIdentity unterscheidet. Eine WorkflowIdentity mit dem Wert null ist zulässig für DefinitionIdentity, jedoch kann nur eine einzige frühere Version eines Workflowdiensts eine WorkflowIdentity mit dem Wert null aufweisen.

Wichtig

WorkflowIdentity sollte keine persönlich identifizierbaren Informationen (PII) enthalten. WorkflowIdentity besteht aus drei Teilen: einem Name (String), einer Version (Version) und einem Package (String). 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.

Regeln für das Hosting mehrerer Versionen eines Workflowdiensts

Wenn ein Benutzer dem WorkflowServiceHost eine zusätzliche Version hinzufügt, müssen mehrere Bedingungen erfüllt sein, damit ein Workflowdienst mit denselben Endpunkten und derselben Beschreibung gehostet werden kann. Wenn eine der zusätzlichen Versionen diese Bedingungen nicht erfüllt, löst der WorkflowServiceHost beim Aufruf von Open eine Ausnahme aus. Jede Workflowdefinition, die für den Host als zusätzliche Version bereitgestellt wird, muss die folgenden Anforderungen erfüllen (wobei die primäre Version die Workflowdefinition ist, die für den Hostkonstruktor bereitgestellt wird). Für die zusätzliche Workflowversion gilt:

  • Sie muss über den gleichen Name wie die primäre Version des Workflowdiensts verfügen.

  • Sie darf im Receive keine SendReply-Aktivität oder Body-Aktivität enthalten, die nicht in der primären Version enthalten ist, und muss mit dem Vorgangsvertrag übereinstimmen.

  • Sie muss eine eindeutige DefinitionIdentity aufweisen. Es darf nur genau eine Workflowdefinition eine nullDefinitionIdentity aufweisen.

Einige Änderungen sind zulässig. Die folgenden Elemente sind möglicherweise zwischen den Versionen unterschiedlich:

  • Die DefinitionIdentity verfügt möglicherweise über einen anderen Namen und ein anderes Paket als die primäre Version.

  • Der AllowBufferedReceive-Wert unterscheidet sich möglicherweise von dem der primären Version.

  • Die ConfigurationName können sich von denen der primären Version unterscheiden.

  • Die ImplementedContracts können sich von denen der primären Version unterscheiden.

Konfigurieren der DefinitionIdentity

Wenn ein Workflowdienst mit dem Workflow-Designer erstellt wird, wird die DefinitionIdentity über das Fenster Eigenschaften festgelegt. Klicken Sie im Designer auf eine Stelle außerhalb der Stammaktivität des Diensts, um den Workflowdienst auszuwählen, und wählen Sie Eigenschaftenfenster im Menü Ansicht aus. Wählen Sie WorkflowIdentity aus der Dropdownliste aus, die neben der DefinitionIdentity-Eigenschaft angezeigt wird, erweitern Sie den Eintrag, und geben Sie die gewünschten WorkflowIdentity-Eigenschaften an. Im folgenden Beispiel wird die DefinitionIdentity mit MortgageWorkflow als Wert für Name und der Version 1.0.0.0 konfiguriert. Package ist optional und ist in diesem Beispiel null.

Screenshot: DefinitionIdentity-Eigenschaft

Für einen selbst gehosteten Workflowdienst wird DefinitionIdentity beim Erstellen des Workflowdiensts konfiguriert. Im folgenden Beispiel wird die DefinitionIdentity mit denselben Werten wie im vorhergehenden Beispiel konfiguriert: mit MortgageWorkflow als Wert für Name und 1.0.0.0 als Wert für Name.

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  

Eine DefinitionIdentity ist nicht erforderlich, obwohl nur eine Version des Workflowdiensts eine DefinitionIdentity mit dem Wert NULL aufweisen darf.

Hinweis

Dies ist hilfreich, wenn der Dienst ursprünglich ohne DefinitionIdentity bereitgestellt wurde und dann eine aktualisierte Version erstellt wird.

Hinzufügen einer neuen Version zu einem im Web gehosteten Workflowdienst

Der erste Schritt beim Konfigurieren einer neuen Version eines Workflowdiensts in einem im Web gehosteten Dienst besteht darin, einen neuen Ordner im App_Code-Ordner zu erstellen, der den gleichen Namen hat wie die Dienstdatei. Wenn die xamlx-Datei des Diensts den Namen MortgageWorkflow.xamlx aufweist, muss der Ordner den Namen MortgageWorkflow erhalten. Legen Sie eine Kopie der xamlx-Datei des ursprünglichen Diensts in diesem Ordner ab, und benennen Sie sie um, z. B. in MortgageWorkflowV1.xamlx. Nehmen Sie die gewünschten Änderungen am primären Dienst vor, aktualisieren Sie seine DefinitionIdentity, und stellen Sie dann den Dienst bereit. Im folgenden Beispiel wurde die DefinitionIdentity mit dem NameMortgageWorkflow und der Version2.0.0.0 aktualisiert.

Screenshot: DefinitionIdentity der WorkflowIdentity

Wenn der Dienst neu gestartet wird, wird die frühere Version automatisch der SupportedVersions-Auflistung hinzugefügt, da sie sich im angegebenen Unterordner App_Code befindet. Beachten Sie, dass die früheren Versionen nicht hinzugefügt werden, wenn die primäre Version des Workflowdiensts für DefinitionIdentity den Wert null aufweist. Eine Version darf eine null-DefinitionIdentity aufweisen, wenn jedoch mehrere Versionen vorhanden sind, darf die primäre Version nicht die Version mit der null-DefinitionIdentity sein; andernfalls werden die früheren Versionen nicht der SupportedVersions-Auflistung hinzugefügt.

Hinzufügen einer neuen Version zu einem selbst gehosteten Workflowdienst

Beim Hinzufügen einer neuen Version zu einem selbst gehosteten Workflowdienst wird der WorkflowServiceHost mit der primären Version des Workflowdiensts konfiguriert, und frühere Versionen müssen der SupportedVersions-Auflistung explizit hinzugefügt werden. Im folgenden Beispiel wird ein WorkflowServiceHost mit einem primären Workflowdienst konfiguriert, der die MortgageWorkflowV2-Workflowdefinition verwendet, und ein mit der MortgageWorkflowV1-Workflowdefinition konfigurierter Workflowdienst wird der SupportedVersions-Auflistung hinzugefügt. Jeder Workflowdienst wird mit einer eindeutigen DefinitionIdentity konfiguriert, die die Version der Workflowdefinition angibt.

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