Delen via


Een langlopende werkstroomservice maken

In dit artikel wordt beschreven hoe u een langlopende werkstroomservice maakt, die gedurende lange tijd kan worden uitgevoerd. Op een bepaald moment kan de werkstroom inactief gaan wachten op aanvullende informatie. Wanneer dit gebeurt, wordt de werkstroom bewaard in een SQL-database en wordt deze uit het geheugen verwijderd. Wanneer de aanvullende informatie beschikbaar komt, wordt het werkstroomexemplaren weer in het geheugen geladen en wordt de uitvoering voortgezet.

In dit scenario implementeert u een vereenvoudigd bestelsysteem. De client verzendt een eerste bericht naar de werkstroomservice om de order te starten. Er wordt een order-id naar de client geretourneerd. Op dit moment wacht de werkstroomservice op een ander bericht van de client en wordt deze inactief en blijft behouden in een SQL Server-database. Wanneer de client het volgende bericht verzendt om een item te bestellen, wordt de werkstroomservice weer in het geheugen geladen en is de verwerking van de order voltooid.

In het codevoorbeeld wordt een tekenreeks geretourneerd waarin staat dat het item is toegevoegd aan de order. Het codevoorbeeld is niet bedoeld als een echte toepassing van de technologie, maar eerder een eenvoudig voorbeeld dat langdurige werkstroomservices illustreert.

Vereisten

U moet de volgende software hebben geïnstalleerd om deze procedure te kunnen gebruiken:

  1. Microsoft SQL Server 2008
  2. Visual Studio 2012
  3. Microsoft .NET Framework 4.6.1

U moet ook bekend zijn met WCF en Visual Studio 2012 en weten hoe u projecten/oplossingen kunt maken.

De SQL Database instellen

  1. Als u wilt dat exemplaren van de werkstroomservice behouden blijven, moet Microsoft SQL Server zijn geïnstalleerd en moet u een database configureren om de persistente werkstroomexemplaren op te slaan. Voer Microsoft SQL Management Studio uit door op de knop Start te klikken, Alle programma's, Microsoft SQL Server 2008 en Microsoft SQL Management Studio te selecteren.

  2. Klik op de knop Verbinding maken om u aan te melden bij het SQL Server-exemplaar

  3. Klik met de rechtermuisknop op Databases in de structuurweergave en selecteer Nieuwe database om een nieuwe database te maken met de naam SQLPersistenceStore .

  4. Voer het SqlWorkflowInstanceStoreSchema.sql scriptbestand uit in de map C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en in de SQLPersistenceStore-database om de benodigde databaseschema's in te stellen.

  5. Voer het SqlWorkflowInstanceStoreLogic.sql scriptbestand uit in de map C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en in de SQLPersistenceStore-database om de benodigde databaselogica in te stellen.

De web-hostwerkstroomservice maken

  1. Maak een lege Visual Studio 2012-oplossing, geef deze de OrderProcessingnaam.

  2. Voeg een nieuw WCF Workflow Service-toepassingsproject toe dat aan de oplossing wordt aangeroepen OrderService .

  3. Selecteer in het dialoogvenster Projecteigenschappen het tabblad Web .

    1. Selecteer onder Actie starten de optie Specifieke pagina en geef op Service1.xamlx.

      Webeigenschappen van werkstroomserviceproject

    2. Selecteer onder Servers Lokale IIS-webserver gebruiken.

      Instellingen voor lokale webserver

      Waarschuwing

      U moet Visual Studio 2012 uitvoeren in de beheerdersmodus om deze instelling te maken.

      Met deze twee stappen configureert u het werkstroomserviceproject dat wordt gehost door IIS.

  4. Open Service1.xamlx als deze nog niet is geopend en verwijder de bestaande Activiteiten ReceiveRequest en SendResponse .

  5. Selecteer de sequentiële serviceactiviteit en klik op de koppeling Variabelen en voeg de variabelen toe die worden weergegeven in de volgende afbeelding. Hiermee worden enkele variabelen toegevoegd die later in de werkstroomservice worden gebruikt.

    Notitie

    Als CorrelationHandle zich niet in de vervolgkeuzelijst Variabeletype bevindt, selecteert u Bladeren naar typen in de vervolgkeuzelijst. Typ CorrelationHandle in het vak Typenaam , selecteer CorrelationHandle in de keuzelijst en klik op OK.

    Variabelen toevoegen

  6. Sleep een ReceiveAndSendReply-activiteitssjabloon naar de sequentiële serviceactiviteit en zet deze neer. Deze reeks activiteiten ontvangt een bericht van een client en stuurt een antwoord terug.

    1. Selecteer de ontvangstactiviteit en stel de eigenschappen in die in de volgende afbeelding zijn gemarkeerd.

      Eigenschappen van ontvangstactiviteit instellen

      Met de eigenschap DisplayName wordt de naam ingesteld die wordt weergegeven voor de activiteit Ontvangen in de ontwerpfunctie. De eigenschappen ServiceContractName en OperationName geven de naam op van het servicecontract en de bewerking die worden geïmplementeerd door de ontvangstactiviteit. Zie Contracten gebruiken in werkstroomservices voor meer informatie over hoe contracten worden gebruikt in werkstroomservices.

    2. Klik op de koppeling Definiëren in de activiteit ReceiveStartOrder en stel de eigenschappen in die worden weergegeven in de volgende afbeelding. U ziet dat het keuzerondje Parameters is geselecteerd. Een benoemde p_customerName parameter is gebonden aan de customerName variabele. Hiermee configureert u de activiteit Ontvangen om bepaalde gegevens te ontvangen en deze gegevens te binden aan lokale variabelen.

      De gegevens instellen die zijn ontvangen door de ontvangstactiviteit

    3. Selecteer de activiteit SendReplyToReceive en stel de gemarkeerde eigenschap in die wordt weergegeven in de volgende afbeelding.

      De eigenschappen van de Activiteit SendReply instellen

    4. Klik op de koppeling Definiëren in de activiteit SendReplyToStartOrder en stel de eigenschappen in die worden weergegeven in de volgende afbeelding. U ziet dat het keuzerondje Parameters is geselecteerd; een parameter met de naam p_orderId is gebonden aan de orderId variabele. Met deze instelling geeft u op dat de activiteit SendReplyToStartOrder een waarde van het type tekenreeks retourneert naar de aanroeper.

      De inhoudsgegevens van sendReply-activiteit configureren

    5. Sleep een toewijzingsactiviteit tussen de activiteiten Receive en SendReply en stel de eigenschappen in zoals wordt weergegeven in de volgende afbeelding:

      Een toewijzingsactiviteit toevoegen

      Hiermee maakt u een nieuwe order-id en wordt de waarde in de orderId-variabele geplaatst.

    6. Selecteer de activiteit ReplyToStartOrder . Klik in het eigenschappenvenster op de knop met het beletselteken voor CorrelationInitializers. Selecteer de koppeling Initializer toevoegen, voer orderIdHandle in het tekstvak Initializer in, selecteer initialisatie van querycorrelatie voor het correlatietype en selecteer p_orderId onder de vervolgkeuzelijst XPATH-query's. Deze instellingen worden weergegeven in de volgende afbeelding. Klik op OK. Hiermee initialiseert u een correlatie tussen de client en dit exemplaar van de werkstroomservice. Wanneer een bericht met deze order-id wordt ontvangen, wordt het doorgestuurd naar dit exemplaar van de werkstroomservice.

      Een correlatie-initialisatiefunctie toevoegen

  7. Sleep een andere ReceiveAndSendReply-activiteit naar het einde van de werkstroom (buiten de reeks met de eerste receive - en SendReply-activiteiten ). Dit ontvangt het tweede bericht dat door de client wordt verzonden en erop reageert.

    1. Selecteer de reeks met de zojuist toegevoegde activiteiten ontvangen en verzenden en klik op de knop Variabelen . Voeg de variabele toe die in de volgende afbeelding is gemarkeerd:

      Nieuwe variabelen toevoegen

      orderResult Voeg ook toe als tekenreeks in het Sequence bereik.

    2. Selecteer de ontvangstactiviteit en stel de eigenschappen in die worden weergegeven in de volgende afbeelding:

      De eigenschappen van de ontvangstactiviteit instellen

      Notitie

      Vergeet niet om het veld ServiceContractName te wijzigen met ../IAddItem.

    3. Klik op de koppeling Definiëren in de activiteit ReceiveAddItem en voeg de parameters toe die worden weergegeven in de volgende afbeelding: Hiermee configureert u de ontvangstactiviteit voor het accepteren van twee parameters, de order-id en de id van het bestelde item.

      Parameters opgeven voor de tweede ontvangst

    4. Klik op de knop Correleren met het beletselteken en voer in orderIdHandle. Klik onder XPath-query's op de vervolgkeuzepijl en selecteer p_orderId. Hiermee configureert u de correlatie voor de tweede ontvangstactiviteit. Zie Correlatie voor meer informatie over correlatie.

      De eigenschap CorresOn instellen

    5. Sleep een If-activiteit direct na de ReceiveAddItem-activiteit en zet deze neer. Deze activiteit werkt net als een if-instructie.

      1. Stel de eigenschap Voorwaarde in op itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)

      2. Sleep een toewijzingsactiviteit naar de sectie Vervolgens en een andere naar de sectie Else om de eigenschappen van de activiteiten toewijzen in te stellen, zoals wordt weergegeven in de volgende afbeelding.

        Het resultaat van de serviceoproep toewijzen

        Als de voorwaarde de sectie Vervolgens istrue, wordt de sectie Uitgevoerd. Als de voorwaarde de else-sectie isfalse, wordt uitgevoerd.

      3. Selecteer de Activiteit SendReplyToReceive en stel de eigenschap DisplayName in die wordt weergegeven in de volgende afbeelding.

        De eigenschappen van sendReply-activiteit instellen

      4. Klik op de koppeling Definiëren in de activiteit SetReplyToAddItem en configureer deze zoals wordt weergegeven in de volgende afbeelding. Hiermee configureert u de SendReplyToAddItem-activiteit om de waarde in de orderResult variabele te retourneren.

        De gegevensbinding instellen voor de SendReply-activiteit

  8. Open het bestand web.config en voeg de volgende elementen toe in de <sectie Gedrag> om werkstroompersistentie in te schakelen. (Zorg ervoor dat u de verbindingsreeks voltooit.)

    <sqlWorkflowInstanceStore connectionString="...;Asynchronous Processing=True" instanceEncodingOption="None" instanceCompletionAction="DeleteAll" instanceLockedExceptionAction="BasicRetry" hostLockRenewalPeriod="00:00:30" runnableInstancesDetectionPeriod="00:00:02" />
              <workflowIdle timeToUnload="0"/>
    
  9. Bouw de oplossing.

Een clienttoepassing maken om de werkstroomservice aan te roepen

  1. Voeg een nieuw consoletoepassingsproject toe dat aan de oplossing wordt aangeroepen OrderClient .

  2. Verwijzingen toevoegen aan de volgende assembly's aan het OrderClient project

    1. System.ServiceModel.dll

    2. System.ServiceModel.Activities.dll

  3. Voeg een servicereferentie toe aan de werkstroomservice en geef OrderService deze op als de naamruimte.

  4. Voeg in de Main() methode van het clientproject de volgende code toe:

    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. Bouw de oplossing en voer de OrderClient toepassing uit. De client geeft de volgende tekst weer:

    Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...
    
  6. Als u wilt controleren of de werkstroomservice is behouden, start u SQL Server Management Studio door naar het menu Start te gaan, Alle programma's, Microsoft SQL Server 2008, SQL Server Management Studio te selecteren.

    1. Vouw in het linkerdeelvenster databases, SQLPersistenceStore, Weergaven en klik met de rechtermuisknop op System.Activities.DurableInstancing.Instances en selecteer Top 1000 rijen selecteren. Controleer in het deelvenster Resultaten of er ten minste één exemplaar wordt vermeld. Er kunnen andere exemplaren zijn van eerdere uitvoeringen als er een uitzondering is opgetreden tijdens het uitvoeren. U kunt bestaande rijen verwijderen door met de rechtermuisknop op System.Activities.DurableInstancing.Instances te klikken en Top 200 rijen bewerken te selecteren, op de knop Uitvoeren te drukken, alle rijen in het resultatenvenster te selecteren en verwijderen te selecteren. Als u wilt controleren of het exemplaar dat in de database wordt weergegeven, het exemplaar is dat uw toepassing heeft gemaakt, controleert u of de weergave exemplaren leeg is voordat u de client uitvoert. Zodra de client de query opnieuw uitvoert (top 1000 rijen selecteren) en controleert u of er een nieuw exemplaar is toegevoegd.
  7. Druk op Enter om het bericht item toevoegen naar de werkstroomservice te verzenden. De client geeft de volgende tekst weer:

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

Zie ook