Windows Workflow Foundation mit ASP.NET

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:

Create a blank 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).

Create the ASP.NET Web Application

Create the Activity Library

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:

Add the Web Form

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:

Creating the In and Out arguments

Füge eine Sequence Activity zum Workflow hinzu. DieSequence Activity stellt sicher, dass die Kindelemente in der vorgegebenen Reihenfolge ablaufen.

AddSequence

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:

Assign the greeting to the Out argument

Bitte beachte, dass jeder Ausdruck im Workflow Designer in Visual Basic verfasst wird.

Das Endergebnis sollte folgendermaßen aussehen:

The finished workflow

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:

The result

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)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s