Über- und untergeordnete Workflows mit permanenter Duplexkorrelation
Ein gängiger Entwurfsansatz für das Implementieren eines Workflows für einen komplexen Prozess mit langer Ausführungsdauer besteht im Identifizieren von Teilen der Geschäftslogik, die in kleineren, einfacheren und wiederverwendbaren Workflows isoliert werden können und deren Ausführung vom Hauptworkflow aus koordiniert werden kann. Beispielsweise können Sie in der Bestellungsverarbeitung entscheiden, die Versandlogik als Workflow (untergeordneten Prozess) zu definieren, der seinerseits bei Bedarf aus dem Hauptprozess der Auftragsverarbeitung (übergeordneter Prozess) aufgerufen wird.
In Windows Workflow Foundation in .NET Framework 4 bestehen keine integrierten Features zum „Aufrufen“ eines Workflows mit langer Ausführungszeit aus einem anderen. Jedoch besteht eine Reihe von Implementierungsoptionen, die Entwicklern die manuelle Konfiguration eines derartigen Verhaltens ermöglichen. Das Erörtern aller verfügbarer Optionen würde den Rahmen dieses Beispiels sprengen. Vielmehr liegt hier der Schwerpunkt auf einem der gängigsten und allgemeinsten Ansätze zum Implementieren des Musters „Workflow aufrufen“ – der dauerhaften Duplexkorrelation, insbesondere im Kontext von WCF-Workflowdiensten mit langer Ausführungsdauer (XAMLX-Workflows). Das Konzept hinter dem Muster der dauerhaften Duplexkorrelation ist einfach – der übergeordnete Workflow ruft einen vom untergeordneten Workflow bereitgestellten Endpunkt auf und übergibt diesem ein Kontexttoken (das für die Korrelation verwendet wird) und eine Rückrufadresse zusammen mit der Anforderungsnachricht. Wenn dann der untergeordnete Workflow nach einiger Zeit abgeschlossen ist, nimmt er einen Rückruf an den übergeordneten Workflow vor, um diesem mitzuteilen, dass die Ausführung abgeschlossen ist.
Weitere Informationen zum manuellen Einrichten des dauerhaften Duplexszenarios finden Sie im MSDN-Artikel zum Thema Dauerhaftes Duplexszenario (https://go.microsoft.com/fwlink/?LinkId=196632) sowie in den zugehörigen WF-Beispielen Beispiel für ein dauerhaftes Duplexszenario (https://go.microsoft.com/fwlink/?LinkId=194430) und unter Vorgehensweise: Erstellen eines Workflowdiensts, der einen anderen Workflowdienst aufruft.
Das Hauptziel dieses Beispiels besteht darin, zwei benutzerdefinierte Aktivitäten bereitzustellen, die auf der IActivityTemplateFactory-Schnittstelle basieren und dafür ausgelegt sind, die Implementierung einer dauerhaften Duplexkorrelation durch Automatisieren des Konfigurationsprozesses zu erleichtern. Die Aktivität Workflow Callable Sequence wird im untergeordneten Workflow anstelle der beim Erstellen des Workflows generierten Standardaktivitäten Empfangen und Senden verwendet. Die Aktivität Call Workflow Sequence wird im übergeordneten Workflow verwendet, um die Aktivitäten und zugeordneten Konfigurationen zu generieren, die zur Kommunikation mit dem untergeordneten Workflow erforderlich sind. Diese Aktivitäten sind wiederverwendbar und können Ihrer Visual Studio-Toolbox hinzugefügt werden.
Das Beispiel besteht aus zwei Projektmappen:
Die erste Lösung (CallWorkflowActivities) enthält die zwei oben erwähnten Aktivitäten. Zum Aktivieren dieser Aktivitäten für die Verwendung im Visual Studio Workflow Designer reicht es aus, die Projektmappe zu kompilieren und der Visual Studio-Toolbox die Aktivitäten aus der resultierenden Assembly hinzuzufügen.
Die zweite Lösung (DurableDuplex_with_CallWorkflowActivities) ist eine Beispielimplementierung der über- und untergeordneten Workflows, die mithilfe von dauerhaften Duplexkorrelationen kommunizieren, die mithilfe der Aktivitäten Workflow Callable Sequence und Call Workflow Sequence konfiguriert werden.
Hinweis
Beispiele werden nur zu Anschauungszwecken bereitgestellt. Sie sind nicht für die Verwendung in einer Produktionsumgebung gedacht und wurden nicht in einer Produktionsumgebung getestet. Microsoft bietet keinen technischen Support für diese Beispiele.
Voraussetzungen
Diese Beispielanwendung richtet sich an Benutzer, die die folgenden Kenntnisse besitzen:
Grundlegende Kenntnisse der Internetinformationsdienste (Internet Information Services, IIS)
Grundlegende Kenntnisse in WCF- und WF-Anwendungen (Windows Workflow Foundation)
Grundlegende Kenntnisse der Windows PowerShell
Grundlegende Kenntnisse zu Microsoft SQL Server
Darüber hinaus müssen die Laufzeitfunktionen der Hostingdienste von Microsoft AppFabric 1.1 für Windows Server installiert und die folgenden Funktionen konfiguriert sein, damit die Lösung DurableDuplex_with_CallWorkflowActivities ausgeführt werden kann.
Persistenzspeicher
Überwachungsspeicher
Speicherort und Dateien der Beispielanwendung
Lösung 1: CallWorkflowActivities
Dateiname | Beschreibung |
---|---|
CallWorkflowActivities.sln |
Projektmappendatei für die CallWorkflowActivities-Projektmappe |
CallWorkflowActivities |
Projektordner |
CallWorkflowActivities.csproj |
Projektdatei |
Properties\AssemblyInfo.cs |
Assemblyinformationsdatei |
Activities\WorkflowCallableSequence.cs, Activities \CallWorkflowService.cs |
Quelldateien für die zwei IActivityTemplateFactory-Aktivitäten – WorkflowCallableSequence und CallWorkflowService |
UI\CallWorkflowConfiguration.xamlUI\CallWorkflowConfiguration.xaml.csUI\WebConfigContent.xamlUI\WebConfigContent.xaml.csUI\WorkflowCallableSequenceConfiguration.xamlUI\WorkflowCallableSequenceConfiguration.xaml.cs |
Layout- und Quelldateien der Benutzeroberfläche für die Dialogfelder, die für die Konfiguration der dauerhaften Duplexkorrelation verwendet werden |
Code\Helpers.cs |
Quellcode mit Unterstützungsklassen |
Images\requiredBang.gif |
Bilddatei für Pflichtfelder |
Lösung 2: DurableDuplex_with_CallWorkflowActivities
Dateiname | Beschreibung |
---|---|
DurableDuplex_with_CallWorkflowActivities.sln |
Projektmappendatei für die DurableDuplex_with_CallWorkflowActivities-Projektmappe |
SampleChildService |
Projektordner für den untergeordneten Beispieldienst |
SampleChildService.csproj |
Projektdateien für den untergeordneten Beispieldienst |
Properties\AssemblyInfo.cs |
Assemblyinformationsdatei |
ChildWorkflow.xamlx |
Definition des untergeordneten Workflowdiensts (XAMLX) |
Web.config |
Webkonfigurationsdatei für den untergeordneten Dienst |
SampleParentService |
Projektordner für den übergeordneten Beispieldienst |
SampleParentService.csproj |
Projektdateien für den übergeordneten Beispieldienst |
Properties\AssemblyInfo.cs |
Assemblyinformationsdatei |
ParentWorkflow.xamlx |
Definition des übergeordneten Workflowdiensts (XAMLX) |
Web.config |
Webkonfigurationsdatei für den übergeordneten Dienst |
SampleClient |
Ordner für den Testclient |
SampleClient.csproj |
Testclient-Projektdatei |
mainForm.cs, mainForm.Designer.cs, mainForm.resx, Program.cs |
Quelldateien für das Hauptformular und die Anwendung |
Properties\Resources.Designer.cs, Properties\Resources.resx, Properties\Settings.Designer.cs, Properties\Settings.settings |
Ressourcenbezogene Dateien und Projekteinstellungen |
Properties\AssemblyInfo.cs |
Assemblyinformationsdatei |
app.config |
Datei mit Anwendungseinstellungen für den Testclient |
Einrichten dieses Beispiels
Starten Sie Visual Studio 2010 mit Administratorberechtigungen.
Hinweis
Diese Schritte veranschaulichen, wie die CallWorkflowActivities- und DurableDuplex_with_CallWorkflowActivities-Projektmappen mit Visual Studio 2010 erstellt und bereitgestellt und wie ein Anwendungspool für die Verwendung mit diesen Diensten konfiguriert wird:
Öffnen Sie <Beispiele>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\CallWorkflowActivities.sln, wobei <Beispiele> für den Pfad steht, unter dem Sie die AppFabric-Beispiele installiert haben.
Klicken Sie im Menü Erstellen auf Projektmappe erstellen. Vergewissern Sie sich im Ausgabefenster, dass das Projekt ohne Fehler erstellt wird.
Hinweis
Die Assembly mit den Aktivitäten WorkflowCallableSequence und CallWorkflowService ist jetzt kompiliert und kann der Symbolleiste hinzugefügt werden (Details finden Sie im Abschnitt „Ausführen dieses Beispiels“).
Öffnen Sie <Beispiele>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, wobei <Beispiele> für den Pfad steht, unter dem Sie die AppFabric-Beispiele installiert haben.
Wenn die Aufforderungen angezeigt werden, die virtuellen Verzeichnisse für die Projekte SampleParentService und SampleChildService zu erstellen, klicken Sie auf Ja.
Klicken Sie im Menü Erstellen auf Projektmappe erstellen. Vergewissern Sie sich im Ausgabefenster, dass die drei Projekte ohne Fehler erstellt werden.
Starten Sie IIS-Manager: Klicken Sie auf Start, klicken Sie auf Alle Programme, klicken Sie auf Microsoft AppFabric 1.1 für Windows Server, und klicken Sie dann auf IIS-Manager.
Erweitern Sie den Knoten Server in der Strukturansicht auf der linken Seite, und klicken Sie dann auf Anwendungspools.
Klicken Sie mit der rechten Maustaste auf den Pool in der Liste, in dem die Beispieldienste ausgeführt werden sollen (Sie können einen vorhandenen Pool verwenden oder einen neuen erstellen), und wählen Sie dann Erweiterte Einstellungen aus.
Legen Sie .NET Framework-Version mithilfe der Dropdownauswahl auf v4.0 fest, und klicken Sie dann auf OK.
Erweitern Sie im linken Bereich Sites, und erweitern Sie dann die Standardwebsite.
Suchen Sie die SampleChildService-Anwendung, klicken Sie mit der rechten Maustaste, wählen Sie Anwendung verwalten aus, und wählen Sie dann Erweiterte Einstellungen aus.
Aktualisieren Sie die Eigenschaft Aktivierte Protokolle von http in http,net.pipe. Beachten Sie, dass nach dem Komma kein Leerzeichen vorhanden ist. Klicken Sie auf OK, um die Änderungen zu bestätigen.
Durchsuchen Sie die Eigenschaft Anwendungspool, um den Anwendungspool auszuwählen, den Sie in Schritt 9 konfiguriert haben.
Suchen Sie die SampleParentService-Anwendung, klicken Sie mit der rechten Maustaste, wählen Sie Anwendung verwalten aus, und wählen Sie dann Erweiterte Einstellungen aus.
Aktualisieren Sie die Eigenschaft Aktivierte Protokolle von http in http,net.pipe. Beachten Sie, dass nach dem Komma kein Leerzeichen vorhanden ist. Klicken Sie auf OK, um die Änderungen zu bestätigen.
Durchsuchen Sie die Eigenschaft Anwendungspool, um den Anwendungspool auszuwählen, den Sie in Schritt 9 konfiguriert haben.
Hinweis
In den Schritten 13 und 16 wird den übergeordneten und untergeordneten Dienstanwendungen das „net.pipe“-Protokoll hinzugefügt, das für die Verwaltung von persistenten Workflowinstanzen erforderlich ist.
Ausführen dieses Beispiels: Option 1
Starten Sie Visual Studio 2010 mit Administratorberechtigungen.
Wichtig
Es bestehen zwei Optionen für das Ausführen dieses Beispiels, und Schritte für beide Optionen werden in diesem Thema angegeben. Option 1 durchläuft die End-to-End-Erfahrung der Verwendung der Aktivitäten WorkflowCallableSequence und CallWorkflowService für das Aufrufen eines untergeordneten Workflows aus einem übergeordneten Workflow schrittweise, während Option 2 nur die endgültige Lösung betrachtet: eine ausführungsbereite Implementierung einer dauerhaften Duplexkorrelation, die den Entwurfsprozess vollständig umgeht. Weitere Informationen finden Sie im Demonstrationsabschnitt weiter unten.
Hinweis
Die Projektmappe CallWorkflowActivities ist dafür ausgelegt, die Implementierungserfahrung einer dauerhaften Duplexkorrelation zur Entwurfszeit zu verbessern. Daher liegt zunächst nichts zum „Ausführen“ vor. Diese Schritte stellen jedoch eine exemplarische Vorgehensweise zum Verwenden der Aktivitäten in einer einfachen Projektmappe bereit, in der ein übergeordneter Workflow einen untergeordneten Workflow aufruft:
Erstellen Sie ein neues Projekt vom Typ WCF-Workflowdienstanwendung (diese Projektvorlage befindet sich unter den Workflowprojekttypen), und benennen Sie das neue Projekt ChildService.
Hinzufügen der benutzerdefinierten Beispielaktivitäten zur Toolbox: Wenn der WF-Designer geöffnet wird, klicken Sie in der Aktivitätsgruppe Messaging mit der rechten Maustaste auf die Toolbox.
Wählen Sie Elemente auswählen aus, und klicken Sie dann auf die Registerkarte System.Activities Components.
Klicken Sie auf Durchsuchen, und navigieren Sie zu <Beispiele>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\ CallWorkflowActivities\bin\Debug. Wählen Sie die Assembly CallWorkflowActivities.dll aus, und klicken Sie dann auf Öffnen. (Dabei handelt es sich um die Assembly, die in Schritt 3 des Abschnitts „Einrichten dieses Beispiels“ dieses Dokuments kompiliert wurde.) Achten Sie auf die neuen zwei Einträge oben in der System.Activities Components-Liste.
Klicken Sie auf OK, um Ihrer Toolbox die Aktivitäten CallWorkflowService und WorkflowCallableSequence hinzuzufügen. Die Toolbox sollte jetzt aussehen, wie auf dem folgenden Screenshot dargestellt.
Implementieren des ChildService-Workflows: Benennen Sie im Projektmappen-Explorer Service1.xamlx in ChildService.xamlx um.
Wählen Sie im Hauptbereich des Designers für den untergeordneten Dienst die Aktivität Sequenzieller Dienst aus, und drücken Sie dann die ENTF-Taste.
Ziehen Sie die WorkflowCallableSequence-Aktivität aus der Toolbox auf die WF-Designer-Oberfläche. Das Konfigurationsdialogfeld wird geöffnet, das Sie schrittweise durch das Einrichten des ChildService als Teilnehmer im Szenario der dauerhaften Duplexkorrelation führt.
Konfigurieren der WorkflowCallableSequence: Geben Sie die Eigenschaften wie im folgenden Screenshot dargestellt ein, und klicken Sie dann auf OK.
Aktualisieren der web.config-Datei: Die ordnungsgemäße Funktion einer dauerhaften Dupleximplementierung hängt in hohem Maß von den richtigen web.config-Einträgen ab. Auf dem Bildschirm Web.config-Aktualisierungen werden automatisch die erforderlichen Einträge für die Datei web.config Ihres untergeordneten Workflows generiert.
Hinweis
Die Datei web.config selbst wird nicht automatisch aktualisiert. Im nächsten Schritt kopieren Sie die erforderlichen Einträge mittels Kopieren und Einfügen in die web.config-Datei.
Klicken Sie auf In die Zwischenablage kopieren und Schließen. Die markierten erforderlichen Einträge werden in die Zwischenablage kopiert und stehen zum Einfügen in die Datei web.config bereit. Klicken Sie im Meldungsfeld auf OK.
Öffnen Sie die Datei web.config für das Projekt ChildService, und fügen Sie den Inhalt der Zwischenablage (aus Schritt 12) direkt hinter dem Tag <system.serviceModel> ein:
... <system.serviceModel> <services> <service name="ChildService"> <endpoint address="" binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceStartWorkflow" /> </service> </services> <client> <endpoint binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceWorkflowCompleted" /> </client> <behaviors> ...
Abschließen der ChildService-Implementierung: Aus Gründen der Einfachheit wird im Hauptteil dieses Workflows der Antwort nur der Wert der Anforderung zugewiesen (standardmäßig sind beide Werte Zeichenfolgen, in realen Implementierungen können diese zu Datenverträgen aktualisiert werden).
Ziehen Sie eine Aktivität Verzögerung aus der Toolbox auf die Body-Sequenz. Konfigurieren Sie die Aktivität Verzögerung mit den folgenden Eigenschaften: Duration = New TimeSpan(0, 2, 0).
Ziehen Sie eine Aktivität Zuordnen aus der Toolbox auf die Body-Sequenz, direkt hinter der Sequenz Verzögerung. Konfigurieren Sie die Aktivität Zuordnen mit den folgenden Eigenschaften: To = response; Value = request.
Speichern Sie das Projekt.
Aktivieren des Diensts für IIS/WAS-Hosting: Zum Konfigurieren des Workflows für Hosting in IIS/WAS und AppFabric klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt ChildService (nicht auf die Projektmappe), und wählen Sie dann Eigenschaften aus.
Wählen Sie die dritte Konfigurationsseite (Web) aus, und wählen Sie dann im Abschnitt Server den Eintrag Lokalen IIS-Webserver verwenden aus. Klicken Sie auf Virtuelles Verzeichnis erstellen, und klicken Sie dann im Popup-Meldungsfeld auf OK. Speichern Sie das Projekt.
Erstellen des ParentService-Workflows: Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe (nicht auf das Projekt), und wählen Sie dann Hinzufügen - > Neues Projekt aus. Wählen Sie als Projekttyp WCF-Workflowdienstanwendung aus, und benennen Sie das neue Projekt ParentService. Klicken Sie auf OK.
Benennen Sie im Projektmappen-Explorer Service1.xamlx in ParentService.xamlx um.
Ziehen Sie die Aktivität CallWorkflowService aus der Toolbox auf die WF-Entwurfsoberfläche (direkt hinter die Aktivität SendResponse). Dadurch wird das Konfigurationsdialogfeld für CallWorkflowService geöffnet.
Navigieren Sie mithilfe der Schaltfläche mit den Auslassungszeichen (…) zur ChildService.xamlx-Workflowdefinition, die in früheren Schritten erstellt wurde, und wählen Sie dann wsHttpContextBinding so aus, dass der Wert der Protokollauswahl aus Schritt 10 entspricht. Das Konfigurationsfenster sollte wie im folgenden Screenshot dargestellt aussehen.
Hinweis
Alle Einstellungen für den Anforderungs/Antwort-Dienstvertrag und die Vorgangsnamen wurden automatisch aus der Definition des untergeordneten Diensts übernommen.
Klicken Sie auf OK.
Aktualisieren der web.config-Datei: Das Dialogfeld Web.config-Aktualisierungen wird mit den erforderlichen Einträgen zum Herstellen einer Verbindung mit dem untergeordneten Dienst gestartet. Beachten Sie, dass für die tatsächliche Adresse des untergeordneten Endpunkts sowie für die Rückrufendpunktadresse Eingaben erforderlich sind.
Klicken Sie auf In die Zwischenablage kopieren und Schließen. Dadurch werden die markierten web.config-Einträge in die Zwischenablage kopiert und stehen zum Einfügen in die Datei web.config bereit. Klicken Sie im Popup-Meldungsfeld auf OK.
Öffnen Sie die Datei web.config des Projekts ParentService, und fügen Sie den Inhalt der Zwischenablage direkt hinter dem Element <system.serviceModel> ein.
Hinweis
Beachten Sie den WICHTIGEN Kommentar in der XML-Datei – der übergeordnete Dienst muss ebenfalls einen Endpunkt für seine Clients bereitstellen. Im Rahmen dieses Beispiels können Sie den im Rahmen des Kommentars definierten <Endpunkt> verwenden. Ihre Datei web.config sollte wie folgt aussehen:
... <system.serviceModel> <services> <service name="Service1"> <endpoint address="" binding="basicHttpBinding" contract="IService" /> <endpoint address="ChildCallback" binding="wsHttpContextBinding" contract="ICallChildService" name="Service1ICallChildServiceWorkflowCompleted" /> </service> </services> <client> <endpoint address="https://localhost/ChildService/ChildService.xamlx" binding="wsHttpContextBinding" bindingConfiguration="Service1ICallChildService_InitCallback" contract="ICallChildService" name="Service1ICallChildServiceStartWorkflow" /> </client> <bindings> <wsHttpContextBinding> <binding name="Service1ICallChildService_InitCallback" clientCallbackAddress="https://localhost/ParentService/ParentService.xamlx/ChildCallback" /> </wsHttpContextBinding> </bindings> <behaviors> <serviceBehaviors> ...
Abschließen der ParentService-Implementierung: Der übergeordnete Workflow muss Parameterwerte an den Dienstaufruf für den untergeordneten Dienst übergeben.
Ziehen Sie zum Zuweisen eines Werts zur Anforderung eine Zuordnen-Aktivität aus der Toolbox auf die Call Workflow-Sequenz direkt oberhalb der Send Request-Aktivität. Konfigurieren Sie die Aktivität Zuordnen mit den folgenden Eigenschaften: To = request; Value = data.ToString().
Speichern Sie das Projekt.
Aktivieren von ParentService für IIS/WAS-Hosting: Zum Konfigurieren des Workflows für Hosting in IIS/WAS und AppFabric klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt ParentService (nicht auf die Projektmappe), und wählen Sie dann Eigenschaften aus.
Wählen Sie die dritte Konfigurationsseite aus – Web, und wählen Sie im Abschnitt Server den Eintrag Lokalen IIS-Webserver verwenden. Klicken Sie auf Virtuelles Verzeichnis erstellen, und klicken Sie dann im Popup-Meldungsfeld auf OK. Speichern Sie das Projekt.
Erstellen Sie das Projekt.
Konfigurieren von IIS/WAS für das Hosten der dauerhaften Dienste ParentService und ChildService: Starten Sie IIS-Manager: Klicken Sie auf Start, klicken Sie auf Alle Programme, klicken Sie auf Microsoft AppFabric 1.1 für Windows Server, und klicken Sie dann auf IIS-Manager.
Erweitern Sie im linken Bereich Sites, und erweitern Sie dann die Standardwebsite.
Suchen Sie die ChildService-Anwendung, klicken Sie mit der rechten Maustaste, wählen Sie Anwendung verwalten aus, und wählen Sie dann Erweiterte Einstellungen aus.
Aktualisieren Sie die Eigenschaft Aktivierte Protokolle von http in http,net.pipe. (Beachten Sie, dass nach dem Komma kein Leerzeichen vorhanden ist.) Klicken Sie auf OK, um die Änderungen zu bestätigen.
Suchen Sie die ParentService-Anwendung, klicken Sie mit der rechten Maustaste, wählen Sie Anwendung verwalten aus, und wählen Sie dann Erweiterte Einstellungen aus.
Aktualisieren Sie die Eigenschaft Aktivierte Protokolle von http in http,net.pipe. (Beachten Sie, dass nach dem Komma kein Leerzeichen vorhanden ist.) Klicken Sie auf OK, um die Änderungen zu bestätigen.
Führen Sie den WCFTestClient aus, um eine übergeordnete Workflowinstanz zu starten. Führen Sie die WCF-Testclientanwendung mit dem folgenden Befehl aus: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe (für 32-Bit-Plattformen) oder C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe (für 64-Bit-Plattformen).
Wählen Sie Hinzufügen - >Dienst hinzufügen aus, um einen Verweis auf den übergeordneten Dienst (https://localhost/ParentService/ParentService.xamlx) hinzuzufügen.
Doppelklicken Sie nach dem Hinzufügen des Verweises auf die Methode GetData(), und geben Sie dann im linken Bereich 123 als Wert des ganzzahligen Parameters ein. Klicken Sie auf Aufrufen.
Verwenden Sie das AppFabric-Dashboard, um den Status der ParentService- und ChildService-Instanzen zu überprüfen. Sie werden bemerken, dass nach dem Abschluss von ChildService der übergeordnete Dienst ebenfalls abgeschlossen wird, da er die Abschlussbenachrichtigung vom untergeordneten Dienst empfängt.
Ausführen dieses Beispiels: Option 2
Starten Sie Visual Studio 2010 mit Administratorberechtigungen.
Wichtig
Es bestehen zwei Optionen für das Ausführen dieses Beispiels, und Schritte für beide Optionen werden in diesem Thema angegeben. Option 1 durchläuft die End-to-End-Erfahrung der Verwendung der Aktivitäten WorkflowCallableSequence und CallWorkflowService für das Aufrufen eines untergeordneten Workflows aus einem übergeordneten Workflow schrittweise, während Option 2 nur die endgültige Lösung betrachtet: eine ausführungsbereite Implementierung einer dauerhaften Duplexkorrelation, die den Entwurfsprozess vollständig umgeht. Weitere Informationen finden Sie im Demonstrationsabschnitt weiter unten.
Öffnen Sie <Beispiele>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, wobei <Beispiele> für den Pfad steht, unter dem Sie die AppFabric-Beispiele installiert haben.
Vergewissern Sie sich, dass SampleClient als Startprojekt festgelegt ist, indem Sie mit der rechten Maustaste auf das Projekt SampleClientklicken und dann auf Als Startprojekt festlegen klicken.
Drücken Sie F5, um das Beispiel auszuführen. Die Beispiel-Testclientanwendung wird gestartet.
Klicken Sie auf Übergeordneten Dienst aufrufen.
Beachten Sie den Text Workflowinstanzen. Er zeigt die Start- bzw. Abschlussereignisse der übergeordneten und untergeordneten Workflows an. In diesem Beispiel startet der übergeordnete Dienst mithilfe der ParallelForEach-Aktivität drei Instanzen des untergeordneten Diensts und wird abgeschlossen, nachdem alle drei untergeordneten Dienste abgeschlossen wurden. Sie können die ausgeführten übergeordneten und untergeordneten Dienstinstanzen auch mithilfe des AppFabric-Dashboards nachverfolgen.
Hinweis
Der untergeordnete Workflow ruht nach dem Starten für zwei Minuten. Während dieses Zeitraums werden alle übergeordneten und untergeordneten Instanzen in den Leerlauf versetzt und im Persistenzspeicher persistent weitergeführt. Die Abschlussereignisse treten nach diesem zweiminütigen Zeitraum ein.
Entfernen dieses Beispiels
Starten Sie IIS-Manager: Klicken Sie auf Start, klicken Sie auf Alle Programme, klicken Sie auf Microsoft AppFabric 1.1 für Windows Server, und klicken Sie dann auf IIS-Manager.
Erweitern Sie den Serverknoten in der Strukturansicht auf der linken Seite. Erweitern Sie Sites, und erweitern Sie dann Standardwebsite.
Klicken Sie auf den Knoten SampleChildService, und drücken Sie dann ENTF.
Klicken Sie auf Ja, um zu bestätigen, dass die ausgewählte Anwendung entfernt werden soll.
Klicken Sie auf den Knoten SampleParentService, und drücken Sie dann ENTF.
Klicken Sie auf Ja, um zu bestätigen, dass die ausgewählte Anwendung entfernt werden soll.
Wenn Sie die Anweisungen aus Option 1 unter „Ausführen dieses Beispiels“ befolgt haben, müssen Sie außerdem diese Schritte ausführen:
Klicken Sie auf den Knoten ChildService, und drücken Sie dann ENTF.
Klicken Sie auf Ja, um zu bestätigen, dass die ausgewählte Anwendung entfernt werden soll.
Klicken Sie auf den Knoten ParentService, und drücken Sie dann ENTF.
Klicken Sie auf Ja, um zu bestätigen, dass die ausgewählte Anwendung entfernt werden soll.
Veranschaulichung
Es bestehen zwei Optionen für das Ausführen dieses Beispiels, und Schritte für beide Optionen werden in diesem Thema angegeben. Option 1 ist gegenüber Option 2 vorzuziehen, da sie die Verwendung der Aktivitäten WorkflowCallableSequence und CallWorkflowService für das Aufrufen eines untergeordneten Workflows aus einem übergeordneten Workflow im ganzen Ablauf durchgeht, und das stellt das Hauptziel dieses Beispiels dar. Option 2 betrachtet nur die endgültige Lösung – eine ausführungsbereite Implementierung einer dauerhaften Duplexkorrelation, die den Entwurfsprozess vollständig umgeht.
Option 1 im Abschnitt „Ausführen dieses Beispiels“ veranschaulicht die Verwendung der zwei benutzerdefinierten Aktivitäten in einem Projekt.
Zuerst wird der untergeordnete Workflowdienst erstellt, die standardmäßige sequenzielle Dienstaktivität wird gelöscht und dann durch die „Aktivität“ WorkflowCallableSequence ersetzt. WorkflowCallableSequence ist eine aktive Vorlagenfactory, die Messagingaktivitäten (Empfangen und Senden) auf der Grundlage der Benutzereingaben generiert und konfiguriert, sodass sie eine Rückrufkorrelation unterstützen. Für die Rückrufkorrelation muss der Anforderungskontext ein eindeutiges Kontexttoken enthalten, das für die Korrelierung zurück zum übergeordneten Dienst verwendet wird, sowie die Rückrufadressen, an die die Abschlussbenachrichtigung gesendet werden soll. Die Empfangen-Aktivität initialisiert ein Rückrufkorrelationshandle aus der eingehenden Anforderung, während die Senden-Aktivität diesem Handle folgt, um die Abschlussbenachrichtigung unter der dynamischen Rückrufadresse, die in der ursprünglichen Anforderung übergeben wurde, zurück an den übergeordneten Dienst zu senden.
Die WorkflowCallableSequence-Logik generiert ebenfalls die web.config-Einträge für den Dienst, die Dienst- und Clientendpunkte und alle erforderlichen Bindungseinträge.
Im nächsten Schritt wird der übergeordnete Workflowdienst erstellt. Die Aktivitätsvorlagenfactory CallWorkflowService fordert die Definition des untergeordneten Dienst an, untersucht seine Konfiguration und generiert auf dieser Grundlage die Messagingaktivitäten (Senden und Empfangen), die für die dauerhafte Duplexkommunikation mit dem untergeordneten Dienst erforderlich sind. Die Send-Aktivität initialisiert die Rückrufkorrelation (logisch handelt es sich hier um den Schritt, in dem das eindeutige Kontexttoken generiert und zusammen mit Anforderungen an den untergeordneten Workflow übergeben wird), und dann korreliert die Receive-Aktivität die Abschlussbenachrichtigungen, die vom untergeordneten Workflow zurückkommen, anhand des gleichen Kontexttokens (durch Korrelieren mit dem Korrelationshandle, das von der Send-Aktivität initialisiert wurde).
Die CallWorkflowService-Logik generiert ebenfalls die web.config-Einträge für den Dienst, die Dienst- und Clientendpunkte und alle erforderlichen Bindungseinträge. Beachten Sie die Verwendung des Attributs clientCallbackAddress in der Definition der benutzerdefinierten Bindungskonfiguration. Dies ist die Adresse, die in die Anforderungsnachricht an den Client aufgenommen wird, damit dieser zur Laufzeit dem richtigen Aufrufer antworten kann (in diesem Fall dem übergeordneten Workflow).
Option 2 unter „Ausführen dieses Beispiels“ stellt eine ausführungsbereite Projektmappe mit dauerhafter Duplexkonfiguration zur Verfügung, die mithilfe von WorkflowCallableSequence im untergeordneten Workflow und CallWorkflowService im übergeordneten Workflow implementiert wurde.
Der Client nimmt Aufrufe an den übergeordneten Dienst vor, der seinerseits mithilfe der ParallelForEach-Aktivität drei Instanzen des untergeordneten Diensts parallel startet. Nach dem Empfang der ursprünglichen Nachricht vom übergeordneten Dienst wird der untergeordnete Dienst für zwei Minuten in den Ruhezustand versetzt (mithilfe der Delay-Aktivität) und sendet nach dem Verstreichen dieses Zeitraums eine Abschlussbenachrichtigung wieder zurück an den übergeordneten Dienst. Der übergeordnete Dienst wird nur abgeschlossen, wenn alle Instanzen des untergeordneten Diensts abgeschlossen wurden. Übergeordnete und untergeordnete Instanzen protokollieren Einträge im Anwendungsereignisprotokoll und geben dabei Samples als Quelle an. Die Clientbenutzeroberfläche überwacht das Anwendungsereignisprotokoll auf diese Ereignisquelle, um die Abschlussereignisse im Textfeld Workflowinstanzen anzuzeigen.
2012-03-05