Windows Workflow Foundation-Funktionsdetails

Durch .NET Framework 4 werden Windows Workflow Foundation eine Reihe von Funktionen hinzugefügt. In diesem Dokument wird eine Reihe neuer Funktionen beschrieben. Darüber hinaus enthält das Dokument detaillierte Informationen zu den Szenarien, in denen sie möglicherweise nützlich sind.

Messagingaktivitäten

Messagingaktivitäten (Receive, SendReply, Send, ReceiveReply) werden zum Senden und Empfangen von WCF-Nachrichten aus Ihrem Workflow verwendet. Receive- und SendReply-Aktivitäten werden verwendet, um einen Windows Communication Foundation (WCF)-Dienstvorgang zu bilden, der wie standardmäßige WCF-Webdienste über WSDL verfügbar gemacht wird. Send und ReceiveReply werden verwendet, um einen Webdienst ähnlich einem WCF ChannelFactory zu nutzen; für Workflow Foundation gibt es auch eine Dienstverweis hinzufügen-Oberfläche, die vorkonfigurierte Aktivitäten erzeugt.

Erste Schritte mit Messagingaktivitäten

  • Erstellen Sie in Visual Studio 2012 ein Projekt für eine Dienstanwendung für WCF-Workflows. Das Paar Receive und SendReply wird auf dem Canvas platziert.

  • Klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie Dienstverweis hinzufügen aus. Zeigen Sie auf eine vorhandene Webdienst-WSDL, und klicken Sie auf OK. Erstellen Sie Ihr Projekt, um die generierten Aktivitäten (mithilfe von Send und ReceiveReply implementiert) in Ihrer Toolbox anzuzeigen.

  • Workflowdienste – Dokumentation

Beispielszenario für Messagingaktivitäten

Ein BestPriceFinder-Dienst ruft mehrere Fluggesellschaften auf, um den besten Ticketpreis für eine bestimmte Route zu finden. Wenn Sie dieses Szenario implementieren, müssen Sie die Nachrichtenaktivitäten verwenden, um die Preisanforderung zu erhalten, die Preise von den Back-End-Diensten abzurufen und auf die Preisanforderung mit dem besten Preis zu antworten. Dies erfordert auch, dass Sie andere vordefinierte Aktivitäten verwenden, um die Geschäftslogik für die Berechnung des besten Preises zu erstellen.

WorkflowServiceHost

Der WorkflowServiceHost ist der vordefinierte Workflowhost, der mehrere Instanzen, Konfigurationen sowie WCF-Messaging unterstützt (obwohl die Verwendung von Messaging zum Hosten der Workflows nicht erforderlich ist). Außerdem wird durch einen Satz von Dienstverhalten die Integration von Persistenz, Nachverfolgung und Instanzsteuerung bereitgestellt. Ebenso wie der ServiceHost von WCF kann sich der WorkflowServiceHost in einer Konsolen-/WinForms-/WPF-Anwendung oder einem Windows-Dienst selbst hosten, oder er wird in IIS bzw. WAS (als XAMLX-Datei) im Internet gehostet.

Erste Schritte mit dem Workflowdiensthost

WorkflowServiceHost-Szenario

Ein BestPriceFinder-Dienst ruft mehrere Fluggesellschaften auf, um den besten Ticketpreis für eine bestimmte Route zu finden. Um dieses Szenario zu implementieren, müssen Sie den Workflow in WorkflowServiceHost hosten. Sie müssen die Nachrichtenaktivitäten auch verwenden, um die Preisanforderung zu erhalten, die Preise von den Back-End-Diensten abzurufen und auf die Preisanforderung mit dem besten Preis zu antworten.

Correlation

Eine Korrelation kann wie folgt definiert werden:

  • Eine Möglichkeit zum Gruppieren von Nachrichten, d. h. die Beziehung zwischen einer Anforderungsnachricht und der dazugehörigen Antwort

  • Eine Möglichkeit, ein Datenelement einer Dienstinstanz zuzuordnen

Erste Schritte

  • Erstellen Sie in Visual Studio ein neues Projekt, um mit der Korrelation zu beginnen. Erstellen Sie eine Variable vom Typ CorrelationHandle.

  • Ein Beispiel für die Verwendung einer Korrelation zum Gruppieren von Nachrichten ist eine Anforderung/Antwort-Korrelation, die Nachrichten zusammen gruppiert.

    • Klicken Sie für eine Receive-Aktivität auf die CorrelationInitializers-Eigenschaft, und fügen Sie mithilfe der oben im ersten Schritt erstellten CorrelationHandle-Variablen ein RequestReplyCorrelationInitializer-Element hinzu.

    • Erstellen Sie eine SendReply-Aktivität, indem Sie mit der rechten Maustaste auf Receive klicken und dann auf „SendReply erstellen“ klicken. Fügen Sie die Aktivität hinter der Receive-Aktivität in den Workflow ein.

  • Ein Beispiel für die Zuordnung eines Datenelements zu einer Dienstinstanz ist die inhaltsbasierte Korrelation, bei der ein Datenelement (z. B. eine Auftrags-ID) einer bestimmten Workflowinstanz zugeordnet wird.

    • Klicken Sie auf die CorrelationInitializers-Eigenschaft einer Messagingaktivität, und fügen Sie mit der oben erstellten QueryCorrelationInitializer-Variable einen CorrelationHandle hinzu. Doppelklicken Sie im Dropdownmenü auf die gewünschte Eigenschaft der Nachricht (z. B. "OrderID"). Legen Sie die CorrelatesWith-Eigenschaft auf die oben verwendete CorrelationHandle-Variable fest.
  • Korrelationsdokumentation

Korrelationsszenario

Ein Auftragsabwicklungs-Workflow wird für die Erstellung neuer Bestellungen und die Aktualisierung bestehender, in Bearbeitung befindlicher Bestellungen verwendet. Um dieses Szenario zu implementieren, müssen Sie den Workflow in WorkflowServiceHost hosten und die Messagingaktivitäten verwenden. Es wäre auch eine Korrelation erforderlich, die auf dem orderId basiert, um sicherzustellen, dass Updates für den richtigen Workflow vorgenommen werden.

Vereinfachte Konfiguration

Das WCF-Konfigurationsschema ist komplex und stellt Benutzern viele schwer zu findende Funktionen bereit. In .NET Framework 4.6.1 wurde insbesondere darauf geachtet, die WDF-Benutzer beim Konfigurieren der Dienste mithilfe der folgenden Funktionen zu unterstützen:

  • Es ist keine explizite Einzeldienstkonfiguration mehr notwendig. Wenn Sie keine <service>-Elemente für den Dienst konfigurieren und der Dienst keine Endpunkte programmgesteuert definiert, wird dem Dienst automatisch ein Satz von Endpunkten hinzugefügt, und zwar ein Endpunkt für jede Dienstbasisadresse und für jeden vom Dienst implementierten Vertrag.

  • Der Benutzer kann Standardwerte für WCF-Bindungen und -Verhalten definieren, die ohne explizite Konfiguration auf Dienste angewendet werden.

  • Standardendpunkte definieren wiederverwendbare vorkonfigurierte Endpunkte, die feste Werte für mindestens eine Endpunkteigenschaft besitzen (Adresse, Bindung und Vertrag) und die die Definition benutzerdefinierter Eigenschaften erlauben.

  • Mit ConfigurationChannelFactory<TChannel> können Sie schließlich die WCF-Clientkonfiguration zentral verwalten. Dies kann auch in Szenarien nützlich sein, in denen die Konfiguration nach der Ladezeit der Anwendungsdomäne ausgewählt oder geändert wird.

Erste Schritte

Vereinfachte Konfigurationsszenarien

  • Ein erfahrener ASMX-Entwickler möchte mit der Verwendung von WCF beginnen. WCF erscheint ihm jedoch zu kompliziert. Er fragt sich, was das alles für Informationen sind, die in eine Konfigurationsdatei eingefügt werden müssen. In .NET 4 können Sie sich sogar entscheiden, überhaupt keine Konfigurationsdatei zu verwenden.

  • Es ist sehr schwierig, einen vorhandenen Satz von WCF-Diensten zu konfigurieren und zu verwalten. Die Konfigurationsdatei enthält Tausende von XML-Codezeilen, und es kann sehr gefährlich sein, diese zu ändern. Es müsste eine Möglichkeit geben, diese vielen Codezeilen auf eine Menge zu reduzieren, die besser zu handhaben ist.

Datenvertragsresolver

In .NET Framework 3.5 gab es einige Einschränkungen beim Entwurf bekannter Typen:

  • Es war nicht möglich, während der Serialisierung oder Deserialisierung bekannte Typen dynamisch hinzuzufügen.

  • Serialisierungsprogramme konnten keine unbekannten xsi:type-Informationen behandeln.

  • Benutzer konnten nicht angeben, welche xsi:type-Informationen erscheinen sollten, um z. B. die Serialisierungsinstanz zu verkleinern.

DataContractResolver löst diese Probleme in .NET Framework 4.5.

Erste Schritte

Datenvertragsresolver-Szenarien

  • Mit dem Datenvertragsresolver kann das Deklarieren von vielen KnownTypeAttribute-Objekten in einem Dienst vermieden werden.

  • Zudem trägt ein Datenvertragsresolver zum Reduzieren des XML-Blobs bei.

Flussdiagramm

Ein Flussdiagramm ist ein bekanntes Paradigma, um Domänenprobleme visuell darzustellen. Es ist ein neues Ablaufsteuerungsformat, das in .NET Framework 4 eingeführt wird. Ein Kernmerkmal des Flussdiagrammes ist, dass zu einem beliebigen Zeitpunkt immer nur eine Aktivität ausgeführt wird. In Flussdiagrammen können Schleifen und alternative Ergebnisse ausgedrückt werden, aber nicht die gleichzeitige Ausführung mehrerer Knoten.

Erste Schritte

Flussdiagrammszenarien

Eine Flussdiagrammaktivität kann verwendet werden, um ein Ratespiel zu implementieren. Das Ratespiel ist sehr simpel: Der Computer wählt eine Zufallszahl aus, die der Spieler erraten muss. Wenn der Spieler einen Tipp abgibt, zeigt der Computer einen Hinweis an (z. B. „die Zahl war zu hoch“). Wenn der Spieler die Zahl in weniger als 7 Versuchen errät, zeigt der Computer einen besonderen Glückwunsch an. Dieses Spiel kann mit einer Kombination der folgenden Verfahrensaktivitäten implementiert werden:

Verfahrensaktivitäten (Sequence, If, ForEach, Switch, Assign, DoWhile, While)

Verfahrensaktivitäten stellen einen Mechanismus bereit, um sequenzielle Ablaufsteuerung mit Konzepten zu modellieren, die Programmierern vertraut sind. Diese Aktivitäten ermöglichen herkömmlich strukturierte Konstrukte der Programmiersprache und stellen ggf. Sprachparität mit allgemeinen Verfahrenssprachen wie C# und Visual Basic bereit.

Erste Schritte

Verfahrensaktivitätsszenarien

  • Parallel: Ein Intranet-Dokumentverwaltungssystem beinhaltet einen Dokumentgenehmigungsworkflow. Dokumente müssen von Personen in mehreren Abteilungen genehmigt werden, bevor sie im Intranet veröffentlicht werden können. Es gibt keine feste Reihenfolge für die Genehmigungen. Sie können jederzeit erteilt werden, während sich das Dokument in der Phase „Genehmigung ausstehend“ befindet. Wenn ein Benutzer ein Dokument zwecks Überprüfung übermittelt, muss es vom direkten Vorgesetzten des Benutzers, dem Intranetadministrator und dem Leiter der internen Kommunikation genehmigt werden.

  • ParallelForEach<T>: Eine WF-Anwendung verwaltet Unternehmenseinkäufe innerhalb eines großen Unternehmens. Die Unternehmensregeln schreiben vor, dass vor einem Kauf die Angebote von drei verschiedenen Anbietern eingeholt werden müssen. Ein Mitarbeiter der Einkaufsabteilung wählt drei Anbieter aus der Anbieterliste des Unternehmens aus. Nachdem diese Anbieter ausgewählt und benachrichtigt wurden, wartet das Unternehmen auf die Unterbreitung ihrer Angebote. Die Angebote können in beliebiger Reihenfolge eingehen. Zum Implementieren dieses Szenarios in WF wird eine ParallelForEach<T>-Aktivität verwendet, die die Auflistung von Anbietern durchläuft und Angebote anfordert. Nachdem alle Angebote eingegangen sind, wird das beste Angebot ausgewählt und angezeigt.

InvokeMethod

Die InvokeMethod-Aktivität erlaubt den Aufruf öffentlicher Methoden in Objekten oder Typen im Gültigkeitsbereich. Die Aktivität unterstützt den Aufruf von Instanz- und statischen Methoden mit oder ohne Parameter (einschließlich Parameterarrays) und generischen Methoden. Zudem erlaubt sie eine synchrone und asynchrone Methodenausführung.

Erste Schritte

  • Erstellen Sie in Visual Studio 2012 eine Workflowkonsolenanwendung. Fügen Sie eine InvokeMethod-Aktivität im Workflow-Designer hinzu, und konfigurieren Sie statische und Instanzmethoden für die Aktivität.

  • Designerdokumentation: InvokeMethod-Aktivitätsdesigner

InvokeMethod-Szenarien

  • Eine Methode in einem Objekt im Gültigkeitsbereich muss aufgerufen werden. Beispielsweise muss einem Wörterbuch ein Wert hinzugefügt werden. Die Add-Methode der Instanz des Wörterbuchs wird aufgerufen, und der Schlüssel und der Wert werden bereitgestellt.

  • Für ein Legacy-CLR-Objekt muss eine Methode aufgerufen werden. Anstatt eine benutzerdefinierte Aktivität zu erstellen, um den Aufruf dieser Legacyklasse zu umschließen, wenn es sich während der Workflowausführung im Gültigkeitsbereich befindet, kann InvokeMethod verwendet werden.

Fehlerbehandlungsaktivitäten

Die TryCatch-Aktivität stellt einen Mechanismus zum Abfangen von Ausnahmen bereit, die während der Ausführung eines Satzes enthaltener Aktivitäten auftreten (vergleichbar mit dem Try/Catch-Konstrukt in C# und Visual Basic). TryCatch stellt eine Ausnahmebehandlung auf Workflowebene bereit. Wenn eine nicht behandelte Ausnahme ausgelöst wird, wird der Workflow abgebrochen, und der Finally-Block wird nicht ausgeführt. Dieses Verhalten ist mit C# konsistent.

Erste Schritte

Fehlerbehandlungsszenarien

Wenn ein Fehler auftritt, müssen ein Satz von Aktivitäten und eine bestimmte Logik ausgeführt werden. Wenn während dieser Fehlerbehandlung festgestellt wird, dass der Fehler nicht behoben werden kann, wird die Ausnahme erneut ausgelöst, und die übergeordnete Aktivität (oder der Host) befasst sich mit dem Problem.

Auswählen der Aktivität

Die Pick-Aktivität stellt eine ereignisbasierte Flusssteuerungsmodellierung in WF bereit. Pick enthält zahlreiche Verzweigungen, wobei jede Verzweigung vor ihrer Ausführung auf ein bestimmtes Ereignis wartet. In diesem Setup verhält sich ein Pick ähnlich wie ein Switch<T>, für den die Aktivität nur einen der überwachten Ereignissätze ausführt. Jeder Branch ist ereignisgesteuert, und das Ereignis, das zuerst auftritt, führt zuerst den entsprechende Branch aus. Alle anderen Verzweigungen werden abgebrochen, und die Überwachung der Ereignisse wird beendet.

Erste Schritte

Auswahlszenario

Ein Benutzer muss zur Eingabe aufgefordert werden. Unter normalen Umständen würde der Entwickler einen Methodenaufruf wie ReadLine verwenden, um einen Benutzer zur Eingabe aufzufordern. Das Problem bei diesem Setup ist, dass das Programm wartet, bis der Benutzer etwas eingibt. In diesem Szenario wird ein Timeout benötigt, um die Blockierung einer blockierenden Aktivität aufzuheben. Ein häufiges Szenario ist, dass eine Aufgabe innerhalb einer bestimmte Zeitspanne abgeschlossen werden muss. Das Umsetzen eines Timeouts für eine blockierende Aktivität ist ein Szenario, bei dem eine Auswahl sehr nützlich ist.

WCF-Routingdienst

Der Routingdienst ist als generischer Softwarerouter konzipiert, mit dem Sie steuern können, wie WCF-Nachrichten zwischen Ihren Clients und Diensten fließen. Der Routingdienst ermöglicht es Ihnen, Ihre Kunden von Ihren Diensten zu entkoppeln, was Ihnen viel mehr Freiheit in Bezug auf die unterstützbaren Konfigurationen und die Flexibilität bei der Wahl des Hostings Ihrer Dienste gibt. In .NET Framework 3.5 waren Clients und Dienste eng miteinander verknüpft. Ein Client musste über alle Dienste bescheid wissen, mit denen er sprechen musste und wo er sich befand. Außerdem bestanden für WCF in .NET Framework 3.5 die folgenden Einschränkungen:

  • Die Fehlerbehandlung war komplex, da diese Logik fest in den Client codiert werden musste.

  • Clients und Dienste mussten immer die gleichen Bindungen verwenden.

  • Dienste waren selten gut aufgeteilt: Es ist einfacher, eine Clientinteraktion mit nur einem Dienst umzusetzen, der alles implementiert, anstatt zwischen mehreren Diensten auswählen zu müssen.

Beim Entwurf des Routingdiensts in .NET 4 wurde dafür Sorge getragen, dass diese Probleme leichter gelöst werden können. Der neue Routingdienst hat die folgenden Funktionen:

  1. Inhaltsbasiertes Routing (MessageFilter-Objekte untersuchen eine Nachricht, um das Ziel der Nachricht zu ermitteln.

  2. Protokollbridging (Transport und Nachricht)

  3. Fehlerbehandlung (der Router fängt Kommunikationsausnahmen ab und führt ein Failover zu Sicherungsendpunkten aus)

  4. Dynamische Aktualisierung (im Speicher) von MessageFilterTable<TFilterData> und Routingkonfiguration.

Erste Schritte

  1. Dokumentation: Routing

  2. Beispiele: Routingdienste [WCF-Beispiele]

  3. Blog: Routing Rules!

Routingszenarien

Der Routingdienst ist in den folgenden Szenarien nützlich:

  • Clients können mit mehreren Diensten interagieren, ohne alle diese Dienste direkt adressieren zu müssen.

  • Clients können zusätzliche Logik für eine Clientanforderung ausführen, um das Routingziel zu bestimmen

  • Die von einem Client durchgeführten Vorgänge können in mehrere Dienstimplementierungen zerlegt werden, ohne dass ein Refactoring des Clients erforderlich ist.

  • Clients und Dienste können unterschiedliche Bindungen mit verschiedenen Sicherheitseinstellungen verwenden.

  • Clients können so konfiguriert werden, dass sie stabiler gegenüber Fehlern oder der Nichtverfügbarkeit von Diensten sind.

WCF-Suche

WCF-Suche ist eine Frameworktechnologie, mit der Sie einen Suchmechanismus in die Anwendungsinfrastruktur integrieren können. Mit WCF-Suche können Sie sicherstellen, dass Ihr Dienst ermittelt werden kann, und Ihre Clients für die Suche nach Diensten konfigurieren. Clients müssen nicht mehr mit einem Endpunkt hartcodiert werden, sodass die Anwendung stabiler und fehlertolerant wird. WCF-Suche ist die perfekte Plattform, um Funktionen für die automatische Konfiguration in die Anwendung zu integrieren.

Das Produkt basiert auf dem WS-Discovery-Standard. Das Produkt zeichnet sich dadurch aus, dass es interoperabel, erweiterbar und generisch ist. Es unterstützt zwei Betriebsmodi:

  1. Verwaltet: Gibt es im Netzwerk eine Entität, die über die vorhandenen Dienste informiert ist, fordern Clients von dieser Entität direkt Informationen an. Dies ist analog zu Active Directory.

  2. Ad-hoc: Clients verwenden Multicastnachrichten, um Dienste zu suchen.

Darüber hinaus sind Ermittlungsnachrichten unabhängig vom Netzwerkprotokoll. Sie können für jedes Protokoll verwendet werden, das die Modusanforderungen unterstützt. So können z. B. Multicastnachrichten über den UDP-Kanal oder ein beliebiges anderes Netzwerk gesendet werden, das Multicastmessaging unterstützt. Mit diesen Designpunkten, in Kombination mit Featureflexibilität, können Sie die Ermittlung speziell an Ihre Projektmappe anpassen.

Erste Schritte

Suchszenarien

Ein Entwickler möchte Endpunkte nicht hartcodieren, da noch nicht feststeht, wann der Dienst verfügbar ist. Stattdessen möchte der Entwickler zur Laufzeit einen Dienst auswählen. Zwischen den Komponenten in der Anwendung ist ein höheres Maß an Entkopplung, Stabilität und automatischer Konfiguration erforderlich.

Nachverfolgung

Die Workflownachverfolgung bietet einen Einblick in die Ausführung einer Workflowinstanz. Die Nachverfolgungsereignisse werden von einem Workflow auf Workflowinstanzebene ausgegeben, wenn im Workflow Aktivitäten ausgeführt werden. Dem Workflowhost muss eine Workflownachverfolgungskomponente hinzugefügt werden, um Nachverfolgungsdatensätze zu abonnieren. Die Nachverfolgungsdatensätze werden mit einem Nachverfolgungsprofil gefiltert. .NET Framework stellt eine ETW-Nachverfolgungskomponente (Event Tracing for Windows, Ereignisablaufverfolgung für Windows) bereit, und in der Datei "machine.config" wird ein Basisprofil installiert.

Erste Schritte

  1. Erstellen Sie in Visual Studio 2010 ein Projekt für eine Dienstanwendung für WCF-Workflows. Um mit der Projekterstellung zu beginnen, werden Receive und SendReply auf dem Canvas platziert.

  2. Öffnen Sie die Datei "web.config", und fügen Sie ein ETW-Nachverfolgungsverhalten ohne Profil hinzu.

    1. Das Standardprofil wird verwendet.

    2. Öffnen Sie die Ereignisanzeige, und aktivieren Sie den Analysekanal im folgenden Knoten: Ereignisanzeige, Anwendungs- und Dienstprotokolle, Microsoft, Windows, Anwendungsserver-Anwendungen. Klicken Sie mit der rechten Maustaste auf Analytisch, und wählen Sie Protokoll aktivieren aus.

    3. Führen Sie den Workflowdienst aus.

    4. Beobachten Sie die Workflownachverfolgungsereignisse in der Ereignisanzeige.

  3. Beispiele: Nachverfolgung

  4. Konzeptionelle Dokumentation: Workflownachverfolgung und Ablaufverfolgung

SQL-Workflowinstanzspeicher

Beim SqlWorkflowInstanceStore handelt es sich um die SQL Server-basierte Implementierung eines Instanzspeichers. Ein Instanzspeicher speichert den Zustand einer ausgeführten Instanz zusammen mit allen Daten, die zum Laden und Fortsetzen dieser Instanz erforderlich sind. Der Diensthost weist den Instanzspeicher an, den Instanzzustand zu speichern, wenn der Workflow beibehalten wird. Wenn für diese Instanz eine Nachricht eingeht oder eine Verzögerungsaktivität abläuft, weist der Diensthost den Instanzspeicher an, den Instanzzustand zu laden.

Erste Schritte

  1. Erstellen Sie in Visual Studio 2012 einen Workflow, der eine implizite oder explizite Persist-Aktivität enthält. Fügen Sie dem Workflowdiensthost das SqlWorkflowInstanceStore-Verhalten hinzu. Sie können die Aktivität dem Code oder der Anwendungskonfiguration hinzufügen.

  2. Beispiele: Persistenz

  3. Konzeptionelle Dokumentation: SQL-Workflowinstanzspeicher.