www.rolandk.de
- Aktuelle Themen zu .Net -
Achtung: Hier handelt es sich um meine alte Seite.
Die aktuelle ist unter folgendem Link erreichbar: www.rolandk.de/wp/
Home Artikel .Net Allgemein Einfacher Workflow Service




















































Einfacher Workflow Service
Samstag, den 08. Oktober 2011 um 06:40 Uhr

 

 

Allgemeines

Von der Grundidee der Workflow Foundation bin ich persönlich schon länger begeistert. Wenn sie richtig verwendet wird, kann die Ablauflogik im Code auf einfache Weise veranschaulicht werden. In diesem Artikel befasse ich mich mit dem Thema "Workflow Services" und zeige eine einfache Möglichkeit, mithilfe von Workflows einen WCF-Dienst zu erstellen und zu hosten. Als Beispiel dient eine Consolenanwendung, welche den oben abgebildeten Webservice über ein Http-Endpoint verfügbar macht und auch gleich selbst abonniert. Das Consolenprogramm dient also Gleichzeitig als Client und als Server.

 

Entwicklung des Workflows

Ein Workflow Service ist im Hintergrund nichts anderes als eine normale Activity, es reicht also, wie bei anderen Workflows auch, zunächst eine neue Activity anzulegen.

 

 

Eine neue Activity ist also angelegt, soweit, so normal wie auch bei anderen Workflows. Die Struktur des Workflows kann wie gewohnt gezeichnet werden. In dem Beispiel zu diesem Artikel habe ich eine Flowchart, eine Activity für den Webservice und anschließend eine Consolenausgabe eingebaut (Siehe Screenshot ganz oben). Eine Activity für den Webservice? Hier liegt die Besonderheit, und zwar wird das Verhalten der Webservice Schnittstelle über die Activities definiert, welche vom Framework unter dem Bereich "Messaging" bereitgestellt werden. In diesem Beispiel habe ich die ReceiveAndSendReply Activity verwendet.

 

 

Sind alle Activities angelegt und verknüpft, so kann die Webservice Schnittstelle konfiguriert werden. An der Stelle wird kein vorhandenes ServiceContract oder Ähnliches benötigt, da es anhand der Konfiguration im Workflow Designer erst angelegt wird. Innerhalb der SendAndReceiveReply Activity kann also die komplette Schnittstelle des Webservice frei konfiguriert werden. Wie man im Designer sieht, ist eine SendAndReceiveReply Activity intern in zwei Activities aufgeteilt. Bei Receive handelt es sich um den Part, der Daten von außen entgegennimmt. SendReplyToReceive ist dem gegenüber für die Rückgabe von Daten verantwortlich. Zwischen Receive und SendReplyToReceive kann die Logik des Webservice implementiert werden. Im Beispiel wird lediglich der Übergabeparameter in eine Variable geschrieben, damit dieser später per Console.WriteLine ausgegeben werden kann. Die Übergabeparameter können wie im nächsten Screenshot konfiguriert werden.

 

 

Abschließend wird im Beispiel noch der Parameter von dem Webservice Aufruf auf den Bildschirm geschrieben.

 

Hosten über WCF

Zum Hosten von Workflow Services steht im Framework die Klasse WorkflowServiceHost zur Verfügung. Im folgenden Beispiel wird der Workflow über eine Http-Bindung bereitgestellt und auch direkt konsumiert (als Namespace wird SelfService verwendet). Der WebService wird also gehostet und danach direkt durch Eingaben auf der Commandozeile aufgerufen. Damit der Dienst einfach konsumiert werden kann, wird ein ServiceMetadataBehaviour hinzugefügt (wsdl-Datei steht dann unter http://localhost:5020/CustomService?wsdl zur Verfügung). Die Link zu dieser wsdl-Datei kann anschließend dem Projekt als Dienstreferenz hinzugefügt werden, allerdings muss das Programm währenddessen auch laufen.

  1. /// <summary>
  2. /// Main method of the application.
  3. /// </summary>
  4. public static void Main(string[] args)
  5. {
  6. string baseAddress = "http://localhost:5020/CustomService";
  7. using (WorkflowServiceHost host = new WorkflowServiceHost(
  8. new MainActivity(),
  9. new Uri(baseAddress)))
  10. {
  11. //Auto generation of wsdl files
  12. host.Description.Behaviors.Add(new ServiceMetadataBehavior()
  13. {
  14. HttpGetEnabled = true
  15. });
  16.  
  17. //Go into listening state
  18. host.Open();
  19. Console.WriteLine("CustomService waiting at: {0}", baseAddress);
  20. Console.WriteLine("Press [ENTER] to exit or type a message to send it to the service.");
  21. Console.WriteLine();
  22.  
  23. //Start a short loop for calling the webservice
  24. string input = string.Empty;
  25. string serviceResult = string.Empty;
  26. Console.Write(">> ");
  27. while (!string.IsNullOrEmpty(input = Console.ReadLine()))
  28. {
  29. //Call workflow service
  30. Stopwatch stopwatch = new Stopwatch();
  31. stopwatch.Start();
  32. {
  33. SelfService.CustomServiceClient serviceClient = new SelfService.CustomServiceClient();
  34. serviceResult = serviceClient.DoSomething(input);
  35. }
  36. stopwatch.Stop();
  37.  
  38. //Show result
  39. Console.WriteLine("Called service and received: " + serviceResult);
  40. Console.WriteLine("Call took {0}ms", stopwatch.ElapsedMilliseconds);
  41. Console.WriteLine();
  42.  
  43. //Prepare next input
  44. Console.Write(">> ");
  45. }
  46.  
  47. //Close service host
  48. host.Close();
  49. }
  50. }

 

Fazit

Dieser Artikel hat kurz beschrieben, wie ein Workflow Service entwickelt, gehostet und konsumiert werden kann. Die Workflow Foundation macht es dem Entwickler leicht, einfache Webdienste anzulegen und zu hosten. Der grafische Ansatz zur Entwicklung der Programmlogik hat dabei auch seine Vorteile, wie zum Beispiel die damit veranschaulichte Programmlogik.

 

Kommentar hinzufügen

Ihr Name:
Kommentar: