Einführung
Windows Workflow Foundation ist eine großartige Technologie um Workflows zu erstellen. Diese können in verschiedenen anderen Technologien benutzen werden, wie beispielsweise SharePoint, WCF, etc. In diesem Beispiel wollen wir die Windows Workflow Foundation und ASP.NET kombinieren.
In diesem Beispiel lernst du wie man einen einfachen Workflow erstellt, der einen Eingabe- und einen Ausgabeparameter hat. Nach der Erstellung des Workflow werden wir diesen in eine einfache ASP.NET-Applikation integrieren.
Das Projekt ist als Download auf der MSDN Beispiel-Seite verfügbar.
Das Szenario
Um die Dinge einfach zu halten, erstellen wir eine einfache Begrüßungs-Applikation. Der Nutzer wird seinen Namen in eine TextBox eingeben und einen Button drücken. Daraufhin wird sein Name angezeigt. Klingt das einfach? Ist es!
File – New – Project
Starte mit der Erstellung einer leeren Visual Studio Solution:
Such dir einen beliebigen Namen für die Solution aus. Jetzt werden wir zwei Projekte zu dieser Solution hinzufügen – Eine ASP.NET Empty Web Application (Workflow.Web) und eine Activitiy Library(WorkflowLibrary).
Ans Werk
Auf der Workflow-Seite
Zum Anfang lösche einfach die Activity1.xaml-Datei. Wir kümmern uns später um den Workflow.
Unsere Webseite
Erstelle eine neue Web Form und nenne sie Default.aspx:
Wir brauchen vier Controls auf unserer Seite:
- Ein Label, dass nur “Your name: ” anzeigt
- Eine Textbox, in der der User seinen Namen einträgt
- Einen Button, der den Workflow starten wird
- Ein Label, welches das Ergebnis des Workflows anzeigen wird
Der Code ist ziemlich unspektakulär. Du braucst nur ein Click-Event auf dem Button zu erstellen:
1: <%@ Page Language="C# AutoEventWirkup="true" CodeBhind="Default.aspx.cs" Inherits="Workflow.Web.Default" %> 2: 3: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4: 5: <html xmlns="http://www.w3.org/1999/xhtml"> 6: <head runat="server"> 7: <title></title> 8: </head> 9: <body> 10: <form id="form1" runat="server"> 11: <div> 12: <asp:Label Text="Your name: " runat="server" /> 13: <asp:TextBox ID="TextBoxName" runat="server" /> 14: <asp:Button ID="ButtonCreateGreeting" Text="Create greeting" runat="server" onclick="ButtonCreateGreeting_Click" /> 15: <br /> 16: <asp:Label ID="LabelGreeting" Text="" runat="server" /> 17: </div> 18: </form> 19: </body> 20: </html>
Erstellung des Workflows
Erstelle eine neue Activity mit Namen Greeting.xaml in unserem Workflow-Projekt. Als erstes brauche wir ein In-Argument und ein Out-Argument. Das In-Argument wird der Name unseres Nutzers übergeben. Das Out-Argument wird die Begrüßung speichern, die später auf unserer Webseite angezeigt wird.
Öffne den Arguments-Tab am unteren Ende des Designers. Das erste Argument hat den Namen ArgUserName, die Richtung In und den Argumententyp String. Das zweite Argument heißt Result, hat die Richtung Out und den Argumentypen String.
In beiden Fällen können die Defaultwerte leer gelassen werden. Das Ergebnis sollte wie folgt aussehen:
Füge eine Sequence Activity zum Workflow hinzu. DieSequence Activity stellt sicher, dass die Kindelemente in der vorgegebenen Reihenfolge ablaufen.
Füge der Sequence Activity eine Assign Activity hinzu. Dieser Activity wird die Begrüßung unseres vorher angelegten Result-Argument zugewiesen.
Die To-Eigenschaft soll unser Result-Argument sein. Die Value-Eigenschaft kann mit dem Expression Editor erstellt werden. Die folgende Abbilung zeigt das Ergebnis:
Bitte beachte, dass jeder Ausdruck im Workflow Designer in Visual Basic verfasst wird.
Das Endergebnis sollte folgendermaßen aussehen:
Und jetzt: Kombinieren…
Um unsere Applikation zu vervollständigen füge der Web-Applikation eine Referenz zum WorkflowLibrary-Projekt hinzu. Wir brauchen zusätzlich die WorkflowInvoker-Klasse. Also füge eine Referenz zur Assembly System.Activities hinzu.
Das Click-Event unseres Buttons sieht wie folgt aus:
1: using System; 2: using System.Activities; 3: using System.Collection.Generic; 4: using WorkflowLibrary; 5: 6: namespace Workflow.Web 7: { 8: public partial class Default : System.Web.UI.Page 9: { 10: protected void Page_Load(object sender, EventArgs e) 11: { 12: 13: } 14: 15: protected void ButtonCreateGreeting_Click(object sender, EventArgs e) 16: { 17: string username = TextBoxName.Text; 18: 19: Greeting greeting = new Greeting { ArgUserName = username }; 20: 21: IDictionary<string, object> results = WorkflowInvoker.Invoke(greeting); 22: LabelGreeting.Text = results["Result"].ToString() 23: } 24: } 25: }
Sieht das magisch aus? Nicht wirklich.
Als erstes holen wir uns den eingegebenen Namen aus der TextBox. Danach erstellen wir eine Instanz unseres Workflows und übergeben ihr den Nutzernamen als ein In-Argument. Um unseren Workflow zu starten benutzen wir die Invoke-Methode zusammen mit unserer Workflow-Instanz. Wir erhalten das Out-Argument als ein Dictionary, in dem der Schlüssel als string und der Wert als object abgelegt sind. Als letztes holen wir uns nur noch unser Result -Argument aus unserem Dictionary und weisen es unserem Begrüßungs-Label hinzu.
Das war’s! Starte das Projekt! Das Ergebnis sollte wie folgt aussehen:
Ein Blick zurück
Wir haben uns angeguckt wie man einen einfachen Workflow erstellt, der In- und Out-Argument enthält und wie Werte zugewiesen werden. Wir haben auch gesehen wie man einen Workflow startet, wie man Argumente übergibt und wie man die Resultate aus dem Workflow wieder rausbekommt. Auf der UI-Seite war nichts besonderes und das Vorgehen in anderen Technologien, wie bspw. Silverlight, ist ähnlich.
– Jan (@Horizon_Net)