Erstellen eines Workflowdiensts mit langer AusführungszeitCreating a Long-running Workflow Service

In diesem Thema wird beschrieben, wie ein Workflowdienst mit langer Laufzeit erstellt wird.This topic describes how to create a long-running workflow service. Workflowdienste mit langer Laufzeit können über einen sehr großen Zeitraum hinweg ausgeführt werden.Long running workflow services may run for long periods of time. Währenddessen kann der Workflow in den Leerlauf wechseln und auf weitere Informationen warten.At some point the workflow may go idle waiting for some additional information. In diesem Fall wird der Workflow in einer SQL-Datenbank beibehalten und aus dem Arbeitsspeicher entfernt.When this occurs the workflow is persisted to a SQL database and is removed from memory. Wenn weitere Informationen für die Workflowinstanz verfügbar sind, wird diese wieder in den Arbeitsspeicher geladen, und die Ausführung wird fortgesetzt.When the additional information becomes available the workflow instance is loaded back into memory and continues executing. In diesem Szenario implementieren Sie ein stark vereinfachtes Bestellsystem.In this scenario you are implementing a very simplified ordering system. Zunächst wird eine Nachricht vom Client an den Workflow gesendet, um die Bestellung zu beginnen.The client sends an initial message to the workflow service to start the order. Die Bestell-ID wird an den Client zurückgegeben.It returns an order ID to the client. Der Workflowdienst wartet nun auf eine weitere Nachricht vom Client, wechselt in den Leerlauf und wird in der SQL-Datenbank beibehalten.At this point the workflow service is waiting for another message from the client and goes into the idle state and is persisted to a SQL Server database. Wenn die nächste Nachricht vom Client mit der Bestellung eines Artikels empfangen wird, wird der Workflowdienst wieder in den Arbeitsspeicher geladen, und die Bestellung wird abschließend bearbeitet.When the client sends the next message to order an item, the workflow service is loaded back into memory and finishes processing the order. In diesem Codebeispiel wird eine Zeichenfolge zurückgegeben, die angibt, dass der Artikel der Bestellung hinzugefügt wurde.In the code sample it returns a string stating the item has been added to the order. Das Codebeispiel ist nicht als reale Anwendung der Technologie gedacht. Es soll vielmehr auf einfache Weise einen Workflowdienst mit langer Laufzeit veranschaulichen.The code sample is not meant to be a real world application of the technology, but rather a simple sample that illustrates long running workflow services. In diesem Thema wird davon ausgegangen, dass Sie mit dem Erstellen von Visual Studio 2012Visual Studio 2012-Projekten und -Projektmappen vertraut sind.This topic assumes you know how to create Visual Studio 2012Visual Studio 2012 projects and solutions.

Erforderliche KomponentenPrerequisites

Sie müssen folgende Software installiert haben, um diese exemplarische Vorgehensweise verwenden zu können:You must have the following software installed to use this walkthrough:

  1. Microsoft SQL Server 2008Microsoft SQL Server 2008

  2. Visual Studio 2012Visual Studio 2012

  3. Microsoft .NET Framework 4.6.1.NET Framework 4.6.1Microsoft .NET Framework 4.6.1.NET Framework 4.6.1

  4. Sie sind mit WCF und Visual Studio 2012Visual Studio 2012 vertraut und wissen, wie Projekte und Projektmappen erstellt werden.You are familiar with WCF and Visual Studio 2012Visual Studio 2012 and know how to create projects/solutions.

So richten Sie die SQL-Datenbank einTo Setup the SQL Database

  1. Damit Workflowdienstinstanzen beibehalten werden können, muss Microsoft SQL Server installiert sein, und Sie müssen eine Datenbank konfiguriert haben, in der die beibehaltenen Workflowinstanzen gespeichert werden können.In order for workflow service instances to be persisted you must have Microsoft SQL Server installed and you must configure a database to store the persisted workflow instances. Microsoft SQL Management Studio ausführen, indem Sie auf die starten Schaltfläche auswählen Programme, Microsoft SQL Server 2008, und Microsoft SQL Management Studio.Run Microsoft SQL Management Studio by clicking the Start button, selecting All Programs, Microsoft SQL Server 2008, and Microsoft SQL Management Studio.

  2. Klicken Sie auf die verbinden Schaltfläche zur Anmeldung beim SQL Server-InstanzClick the Connect button to log on to the SQL Server instance

  3. Klicken Sie mit der rechten Maustaste auf Datenbanken in der Strukturansicht, und wählen neue Datenbank...Right click Databases in the tree view and select New Database.. So erstellen eine neue Datenbank mit dem Namen SQLPersistenceStore.to create a new database called SQLPersistenceStore.

  4. Führen Sie die Skriptdatei SqlWorkflowInstanceStoreSchema.sql unter C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en in der SQLPersistenceStore-Datenbank aus, um die erforderlichen Datenbankschemas einzurichten.Run the SqlWorkflowInstanceStoreSchema.sql script file located in the C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en directory on the SQLPersistenceStore database to set up the needed database schemas.

  5. Führen Sie die Skriptdatei SqlWorkflowInstanceStoreLogic.sql unter C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en in der SQLPersistenceStore-Datenbank aus, um die erforderliche Datenbanklogik einzurichten.Run the SqlWorkflowInstanceStoreLogic.sql script file located in the C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en directory on the SQLPersistenceStore database to set up the needed database logic.

So erstellen Sie den im Internet gehosteten WorkflowdienstTo Create the Web Hosted Workflow Service

  1. Erstellen Sie eine Visual Studio 2012Visual Studio 2012-Projektmappe mit dem Namen OrderProcessing.Create an empty Visual Studio 2012Visual Studio 2012 solution, name it OrderProcessing.

  2. Fügen Sie der Projektmappe ein neues Projekt für eine WCF-Workflowdienstanwendung mit dem Namen OrderService hinzu.Add a new WCF Workflow Service Application project called OrderService to the solution.

  3. Wählen Sie im Eigenschaftendialogfeld Projekts die Web Registerkarte.In the project properties dialog, select the Web tab.

    1. Klicken Sie unter Startaktion wählen bestimmte Seite , und geben Sie Service1.xamlx.Under Start Action select Specific Page and specify Service1.xamlx.

      Webeigenschaften für Workflowdienstprojekt WorkflowWorkflow Service Project Web Properties

    2. Klicken Sie unter Server wählen lokalen IIS-Webserver verwenden.Under Servers select Use Local IIS Web server.

      Lokale WebservereinstellungenLocal Web Server Settings

      Warnung

      Visual Studio 2012Visual Studio 2012 muss im Administratormodus ausgeführt werden, um diese Einstellung vorzunehmen.You must run Visual Studio 2012Visual Studio 2012 in administrator mode to make this setting.

      Mit diesen beiden Schritten wird das Workflowdienstprojekt konfiguriert, das von IIS gehostet werden soll.These two steps configure the workflow service project to be hosted by IIS.

  4. Öffnen Sie Service1.xamlx ist dies nicht bereits geöffnet ist, und löschen Sie die vorhandene ReceiveRequest und SendResponse Aktivitäten.Open Service1.xamlx if it is not open already and delete the existing ReceiveRequest and SendResponse activities.

  5. Wählen Sie die sequenzieller Dienst Aktivität, und klicken Sie auf die Variablen verknüpfen, und fügen die Variablen in der folgenden Abbildung gezeigt.Select the Sequential Service activity and click the Variables link and add the variables shown in the following illustration. Dadurch werden einige Variablen hinzugefügt, die im weiteren Verlauf in diesem Workflow verwendet werden.Doing this adds some variables that will be used later on in the workflow service.

    Hinweis

    Wenn CorrelationHandle nicht in der Dropdownliste Variablentyp enthalten ist, wählen Sie nach Typen suchen aus der Dropdownliste aus.If CorrelationHandle is not in the Variable Type drop-down, select Browse for types from the drop-down. Geben Sie CorrelationHandle im die Typnamen Feld, wählen Sie CorrelationHandle aus dem Listenfeld aus, und klicken Sie auf OK.Type CorrelationHandle in the Type name box, select CorrelationHandle from the listbox and click OK.

    Hinzufügen von VariablenAdd Variables

  6. Drag & drop eine ReceiveAndSendReply Aktivitätsvorlage in der sequenzieller Dienst Aktivität.Drag and drop a ReceiveAndSendReply activity template into the Sequential Service activity. Diese Gruppe von Aktivitäten empfängt eine Nachricht von einem Client und sendet eine Antwort.This set of activities will receive a message from a client and send a reply back.

    1. Wählen Sie die Receive Aktivität, und legen die Eigenschaften in der folgenden Abbildung hervorgehoben.Select the Receive activity and set the properties highlighted in the following illustration.

      Set Receive-AktivitätseigenschaftenSet Receive Activity Properties

      Mit der DisplayName-Eigenschaft wird der angezeigte Name für die Receive-Aktivität im Designer festgelegt.The DisplayName property sets the name displayed for the Receive activity in the designer. Mit der ServiceContractName-Eigenschaft und der OperationName-Eigenschaft wird der Name des Dienstvertrags und des Vorgangs angegeben, die von der Receive-Aktivität implementiert werden.The ServiceContractName and OperationName properties specify the name of the service contract and operation that are implemented by the Receive activity. Weitere Informationen zur Verwendungsweise von Verträgen in Workflowdiensten finden Sie unter Verwenden von Verträgen im Workflow.For more information about how contracts are used in Workflow services see Using Contracts in Workflow.

    2. Klicken Sie auf die definieren... wiederherstellungsverknüpfung in der ReceiveStartOrder Aktivität, und legen Sie die Eigenschaften, die in der folgenden Abbildung gezeigt.Click the Define... link in the ReceiveStartOrder activity and set the properties shown in the following illustration. Beachten Sie, dass die Parameter Optionsfeld ausgewählt ist, einen Parameter namens p_customerName gebunden ist, um die customerName Variable.Notice that the Parameters radio button is selected, a parameter named p_customerName is bound to the customerName variable. Konfiguriert, um die Receive Aktivität einige Daten zu empfangen und diese Daten zu lokalen Variablen zu binden.This configures the Receive activity to receive some data and bind that data to local variables.

      Festlegen der von der Receive-Aktivität empfangenen DatenSetting the data received by the Receive activity

    3. Wählen Sie die SendReplyToReceive Aktivität, und legen die hervorgehobene Eigenschaft, die in der folgenden Abbildung gezeigt.Select The SendReplyToReceive activity and set the highlighted property shown in the following illustration.

      Festlegen der Eigenschaften der SendReply-AktivitätSetting the properties of the SendReply activity

    4. Klicken Sie auf die definieren... wiederherstellungsverknüpfung in der SendReplyToStartOrder Aktivität, und legen Sie die Eigenschaften, die in der folgenden Abbildung gezeigt.Click the Define... link in the SendReplyToStartOrder activity and set the properties shown in the following illustration. Beachten Sie, dass die Parameter Optionsfeld aktiviert und der Parameter p_orderId gebunden ist, um die orderId Variable.Notice that the Parameters radio button is selected; a parameter named p_orderId is bound to the orderId variable. Mit dieser Einstellung wird festgelegt, dass von der SendReplyToStartOrder-Aktivität ein Wert vom Typ Zeichenfolge an den Aufrufer zurückgegeben wird.This setting specifies that the SendReplyToStartOrder activity will return a value of type string to the caller.

      Konfigurieren der SendReply-aktivitätsinhaltsdatenConfiguring the SendReply activity content data

    5. Drag & drop eine Assign-Aktivität zwischen der Receive und SendReply Aktivitäten und die Eigenschaften festlegen, wie in der folgenden Abbildung gezeigt:Drag and drop an Assign activity in between the Receive and SendReply activities and set the properties as shown in the following illustration:

      Hinzufügen einer zuweisungsaktivitätAdding an assign activity

      Dadurch wird eine neue Bestell-ID erstellt, und der Wert wird in der orderId-Variablen platziert.This creates a new order ID and places the value in the orderId variable.

    6. Wählen Sie die ReplyToStartOrder Aktivität.Select the ReplyToStartOrder activity. Klicken Sie im Eigenschaftenfenster auf die Schaltfläche mit den Auslassungspunkten für CorrelationInitializers.In the properties window click the ellipsis button for CorrelationInitializers. Wählen Sie die Initialisierer hinzufügen verknüpfen möchten, geben Sie orderIdHandle im initialisierertextfeld ein, wählen Sie abfragekorrelationsinitialisierer für den Korrelationstyp aus, und wählen Sie im Dropdownfeld XPath-Abfragen den Eintrag P_orderId.Select the Add initializer link, enter orderIdHandle in the Initializer text box, select Query correlation initializer for the Correlation type, and select p_orderId under the XPATH Queries dropdown box. Diese Einstellungen sind in der folgenden Abbildung dargestellt.These settings are shown in the following illustration. Klicken Sie auf OK.Click OK. Dadurch wird eine Korrelation zwischen dem Client und dieser Instanz des Workflowdiensts initialisiert.This initializes a correlation between the client and this instance of the workflow service. Wenn eine Nachricht mit dieser Bestell-ID empfangen wird, wird sie an diese Instanz des Workflowdiensts weitergeleitet.When a message containing this order ID is received it is routed to this instance of the workflow service.

      Hinzufügen eines korrelationsinitialisierersAdding a correlation initializer

  7. Drag & drop ein weiteres ReceiveAndSendReply Aktivität bis zum Ende des Workflows (außerhalb der Sequenz , enthält die erste Receive und SendReply Aktivitäten).Drag and drop another ReceiveAndSendReply activity to the end of the workflow (outside the Sequence containing the first Receive and SendReply activities). Dadurch wird die zweite Meldung empfangen, die vom Client gesendet wurde, und beantwortet.This will receive the second message sent by the client and respond to it.

    1. Wählen Sie die Sequenz , enthält die neu hinzugefügte Receive und SendReply Aktivitäten, und klicken Sie auf die Variablen Schaltfläche.Select the Sequence that contains the newly added Receive and SendReply activities and click the Variables button. Fügen Sie die in der folgenden Abbildung hervorgehobene Variable hinzu:Add the variable highlighted in the following illustration:

      Hinzufügen von neuen VariablenAdding new variables

    2. Wählen Sie die Receive Aktivität, und legen Sie die Eigenschaften, die in der folgenden Abbildung gezeigt:Select the Receive activity and set the properties shown in the following illustration:

      Legen Sie die Receive-AktivitätseigenschaftenSet the Receive acitivity properties

    3. Klicken Sie auf die definieren... wiederherstellungsverknüpfung in der ReceiveAddItem Aktivität, und fügen Sie die Parameter in der folgenden Abbildung dargestellt: konfiguriert, um die Receive-Aktivität akzeptiert zwei Parameter, die die Bestell-ID und die ID des zu sortierenden Elements.Click the Define... link in the ReceiveAddItem activity and add the parameters shown in the following illustration:This configures the receive activity to accept two parameters, the order ID and the ID of the item being ordered.

      Angeben von Parametern für die zweite empfangenSpecifying parameters for the second receive

    4. Klicken Sie auf die CorrelateOn Auslassungszeichen und geben Sie orderIdHandle.Click the CorrelateOn ellipsis button and enter orderIdHandle. Klicken Sie unter XPath-Abfragen, klicken Sie auf den Dropdownpfeil, und wählen Sie p_orderId.Under XPath Queries, click the drop down arrow and select p_orderId. Dadurch wird die Korrelation für die zweite Receive-Aktivität konfiguriert.This configures the correlation on the second receive activity. Weitere Informationen zur Korrelation finden Sie unter Korrelation.For more information about correlation see Correlation.

      Festlegen der CorrelatesOn-EigenschaftSetting the CorrelatesOn property

    5. Drag & drop ein Wenn Aktivität unmittelbar nach der ReceiveAddItem Aktivität.Drag and drop an If activity immediately after the ReceiveAddItem activity. Diese Aktivität verhält sich analog zu einer Anweisung.This activity acts just like an if statement.

      1. Legen Sie die Bedingung Eigenschaft itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)Set the Condition property to itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)

      2. Drag & drop ein zuweisen Aktivität in der dann Abschnitt und eine andere in der Else Abschnitt Festlegen der Eigenschaften eines der zuweisen Aktivitäten, wie in der folgenden Abbildung dargestellt.Drag and drop an Assign activity in to the Then section and another into the Else section set the properties of the Assign activities as shown in the following illustration.

        Zuweisen des Ergebnisses des DienstaufrufsAssigning the result of the service call

        Wenn die Bedingung true der dann Abschnitt ausgeführt wird.If the condition is true the Then section will be executed. Wenn die Bedingung false der Else Bereich wird ausgeführt.If the condition is false the Else section is executed.

      3. Wählen Sie die SendReplyToReceive Aktivität, und legen die DisplayName Eigenschaft, die in der folgenden Abbildung gezeigt.Select the SendReplyToReceive activity and set the DisplayName property shown in the following illustration.

        Festlegen der SendReply-AktivitätseigenschaftenSetting the SendReply activity properties

      4. Klicken Sie auf die definieren... wiederherstellungsverknüpfung in der SetReplyToAddItem Aktivität und konfigurieren Sie ihn wie in der folgenden Abbildung dargestellt.Click the Define ... link in the SetReplyToAddItem activity and configure it as shown in the following illustration. Konfiguriert, um die SendReplyToAddItem Aktivität zum Zurückgeben des Werts in der orderResult Variable.This configures the SendReplyToAddItem activity to return the value in the orderResult variable.

        Einrichten der Datenbindung für die SendReply-AktivitätSetting the data binding for the SendReply activit

  8. Öffnen Sie die Datei "Web.config", und fügen Sie die folgenden Elemente in der <Verhalten > Abschnitt aus, um die Workflowpersistenz zu aktivieren.Open the web.config file and add the following elements in the <behavior> section to enable workflow persistence.

    <sqlWorkflowInstanceStore connectionString="Data Source=your-machine\SQLExpress;Initial Catalog=SQLPersistenceStore;Integrated Security=True;Asynchronous Processing=True" instanceEncodingOption="None" instanceCompletionAction="DeleteAll" instanceLockedExceptionAction="BasicRetry" hostLockRenewalPeriod="00:00:30" runnableInstancesDetectionPeriod="00:00:02" />  
              <workflowIdle timeToUnload="0"/>  
    

    Warnung

    Ersetzen Sie den Namen des Hosts und der SQL Server-Instanz aus dem vorherigen Codeausschnitt.Make sure to replace your host and SQL server instance name in the previous code snippet.

  9. Erstellen Sie die Projektmappe.Build the solution.

So erstellen Sie eine Clientanwendung zum Aufrufen des WorkflowdienstsTo Create a Client Application to Call the Workflow Service

  1. Fügen Sie der Projektmappe ein neues Konsolenanwendungsprojekt mit dem Namen OrderClient hinzu.Add a new Console application project called OrderClient to the solution.

  2. Fügen Sie dem OrderClient-Projekt Verweise auf die folgenden Assemblys hinzu:Add references to the following assemblies to the OrderClient project

    1. System.ServiceModel.dllSystem.ServiceModel.dll

    2. System.ServiceModel.Activities.dllSystem.ServiceModel.Activities.dll

  3. Fügen Sie dem Workflowdienst einen Dienstverweis hinzu, und geben Sie OrderService als Namespace an.Add a service reference to the workflow service and specify OrderService as the namespace.

  4. Fügen Sie der Main()-Methode des Clientprojekts den folgenden Code hinzu:In the Main() method of the client project add the following code:

    static void Main(string[] args)  
    {  
       // Send initial message to start the workflow service  
       Console.WriteLine("Sending start message");  
       StartOrderClient startProxy = new StartOrderClient();  
       string orderId = startProxy.StartOrder("Kim Abercrombie");  
    
       // The workflow service is now waiting for the second message to be sent  
       Console.WriteLine("Workflow service is idle...");  
       Console.WriteLine("Press [ENTER] to send an add item message to reactivate the workflow service...");  
       Console.ReadLine();  
    
       // Send the second message  
       Console.WriteLine("Sending add item message");  
       AddItemClient addProxy = new AddItemClient();  
       AddItem item = new AddItem();  
       item.p_itemId = "Zune HD";  
       item.p_orderId = orderId;  
    
       string orderResult = addProxy.AddItem(item);  
       Console.WriteLine("Service returned: " + orderResult);  
    }  
    
  5. Erstellen Sie die Projektmappe, und führen Sie die OrderClient-Anwendung aus.Build the solution and run the OrderClient application. Der folgende Text wird vom Client angezeigt:The client will display the following text:

    Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...  
    
  6. Um sicherzustellen, dass der Workflowdienst beibehalten wurde, starten Sie SQL Server Management Studio durch das Aufrufen der starten im Menü auswählen Programme, fürMicrosoftSQLServer2008, SQL Server Management Studio.To verify that the workflow service has been persisted, start the SQL Server Management Studio by going to the Start menu, Selecting All Programs, Microsoft SQL Server 2008, SQL Server Management Studio.

    1. Erweitern Sie im linken Bereich Datenbanken, SQLPersistenceStore, Ansichten und mit der rechten Maustaste auf System.Activities.DurableInstancing.Instances , und wählen Sie oberste 1000 Zeilen auswählen.In the left hand pane expand, Databases, SQLPersistenceStore, Views and right click System.Activities.DurableInstancing.Instances and select Select Top 1000 Rows. In der Ergebnisse Bereich sollte mindestens eine Instanz aufgeführt.In the Results pane verify you see at least one instance listed. Es kann sein, dass auch Instanzen früherer Ausführungen aufgelistet sind, wenn Fehler bei der Ausführung aufgetreten sind.There may be other instances from prior runs if an exception occurred while running. Sie können vorhandene Zeilen löschen, indem Sie mit der rechten Maustaste auf System.Activities.DurableInstancing.Instances auswählen und oberste 200 Zeilen bearbeiten, drücken die Execute Schaltfläche Wählen Sie alle Zeilen im Ergebnisbereich und löschen.You can delete existing rows by right clicking System.Activities.DurableInstancing.Instances and selecting Edit Top 200 rows, pressing the Execute button, selecting all rows in the results pane and selecting delete. Um zu überprüfen, ob in der Datenbank die Instanz angezeigt wird, die von Ihrer Anwendung erstellt wurde, können Sie überprüfen, ob die Ansicht für Instanzen vor Ausführung des Clients leer ist.To verify the instance displayed in the database is the instance your application created, verify the instances view is empty prior to running the client. Führen Sie die Abfrage (Oberste 1000 Zeilen auswählen) erneut aus, sobald der Client ausgeführt wird, und überprüfen Sie, ob eine neue Instanz hinzugefügt wurde.Once the client is running re-run the query (Select Top 1000 Rows) and verify a new instance has been added.
  7. Drücken Sie die EINGABETASTE, um die Nachricht zum Hinzufügen des Artikels an den Workflowdienst zu senden.Press enter to send the add item message to the workflow service. Der folgende Text wird vom Client angezeigt:The client will display the following text:

    Sending add item messageService returned: Item added to orderPress any key to continue . . .  
    

Siehe auchSee Also

WorkflowdiensteWorkflow Services