Skapa en långvarig arbetsflödestjänst
I det här avsnittet beskrivs hur du skapar en långvarig arbetsflödestjänst. Långvariga arbetsflödestjänster kan köras under långa tidsperioder. Vid något tillfälle kan arbetsflödet gå inaktivt i väntan på ytterligare information. När detta inträffar sparas arbetsflödet i en SQL-databas och tas bort från minnet. När ytterligare information blir tillgänglig läses arbetsflödesinstansen in i minnet igen och fortsätter att köras. I det här scenariot implementerar du ett mycket förenklat beställningssystem. Klienten skickar ett första meddelande till arbetsflödestjänsten för att starta ordern. Det returnerar ett order-ID till klienten. Nu väntar arbetsflödestjänsten på ett annat meddelande från klienten och hamnar i inaktivt tillstånd och sparas i en SQL Server-databas. När klienten skickar nästa meddelande för att beställa ett objekt läses arbetsflödestjänsten in i minnet igen och bearbetningen av ordern slutförs. I kodexemplet returneras en sträng som anger att objektet har lagts till i ordningen. Kodexemplet är inte avsett att vara en verklig tillämpning av tekniken, utan snarare ett enkelt exempel som illustrerar långvariga arbetsflödestjänster. Det här avsnittet förutsätter att du vet hur du skapar Visual Studio 2012-projekt och lösningar.
Förutsättningar
Du måste ha följande programvara installerad för att kunna använda den här genomgången:
Microsoft SQL Server 2008
Visual Studio 2012
Microsoft .NET Framework 4.6.1
Du är bekant med WCF och Visual Studio 2012 och vet hur du skapar projekt/lösningar.
Konfigurera SQL Database
För att arbetsflödestjänstinstanser ska bevaras måste du ha Microsoft SQL Server installerat och du måste konfigurera en databas för att lagra de bevarade arbetsflödesinstanserna. Kör Microsoft SQL Management Studio genom att klicka på startknappen , välja Alla program, Microsoft SQL Server 2008 och Microsoft SQL Management Studio.
Klicka på knappen Anslut för att logga in på SQL Server-instansen
Högerklicka på Databaser i trädvyn och välj Ny databas.. Om du vill skapa en ny databas med namnet
SQLPersistenceStore
.Kör SqlWorkflowInstanceStoreSchema.sql-skriptfilen i katalogen C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en i SQLPersistenceStore-databasen för att konfigurera de databasscheman som behövs.
Kör den SqlWorkflowInstanceStoreLogic.sql skriptfilen som finns i katalogen C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en i SQLPersistenceStore-databasen för att konfigurera den databaslogik som behövs.
Skapa den webbaserade arbetsflödestjänsten
Skapa en tom Visual Studio 2012-lösning, ge den
OrderProcessing
namnet .Lägg till ett nytt WCF Workflow Service Application-projekt som anropas
OrderService
till lösningen.I dialogrutan projektegenskaper väljer du fliken Webb .
Under Startåtgärd väljer du Specifik sida och anger
Service1.xamlx
.Under Servrar väljer du Använd lokal IIS-webbserver.
Varning
Du måste köra Visual Studio 2012 i administratörsläge för att göra den här inställningen.
De här två stegen konfigurerar arbetsflödestjänstprojektet som ska hanteras av IIS.
Öppna
Service1.xamlx
om den inte redan är öppen och ta bort de befintliga aktiviteterna ReceiveRequest och SendResponse .Välj aktiviteten Sekventiell tjänst och klicka på länken Variabler och lägg till variablerna som visas i följande bild. När du gör detta läggs vissa variabler som kommer att användas senare i arbetsflödestjänsten.
Kommentar
Om CorrelationHandle inte finns i listrutan Variabeltyp väljer du Bläddra efter typer i listrutan. Skriv CorrelationHandle i rutan Typnamn , välj CorrelationHandle i listrutan och klicka på OK.
Dra och släpp en Aktivitetsmall för ReceiveAndSendReply till aktiviteten Sekventiell tjänst . Den här uppsättningen aktiviteter tar emot ett meddelande från en klient och skickar ett svar tillbaka.
Välj aktiviteten Ta emot och ange de egenskaper som är markerade i följande bild.
Egenskapen DisplayName anger namnet som visas för aktiviteten Ta emot i designern. Egenskaperna ServiceContractName och OperationName anger namnet på det tjänstkontrakt och den åtgärd som implementeras av aktiviteten Ta emot. Mer information om hur kontrakt används i Arbetsflödestjänster finns i Använda kontrakt i arbetsflöde.
Klicka på länken Definiera... i aktiviteten ReceiveStartOrder och ange egenskaperna som visas i följande bild. Observera att knappen Parametrar är markerad, en parameter med namnet
p_customerName
är bunden till variabelncustomerName
. Detta konfigurerar aktiviteten Ta emot för att ta emot vissa data och binda dessa data till lokala variabler.Välj Aktiviteten SendReplyToReceive och ange den markerade egenskapen som visas i följande bild.
Klicka på länken Definiera... i aktiviteten SendReplyToStartOrder och ange egenskaperna som visas i följande bild. Observera att knappen Parametrar är markerad. En parameter med namnet
p_orderId
är bunden till variabelnorderId
. Den här inställningen anger att aktiviteten SendReplyToStartOrder returnerar ett värde av typen sträng till anroparen.Dra och släpp en Tilldela-aktivitet mellan aktiviteterna Receive och SendReply och ange egenskaperna enligt följande bild:
Detta skapar ett nytt order-ID och placerar värdet i variabeln orderId.
Välj aktiviteten ReplyToStartOrder. I egenskapsfönstret klickar du på ellipsknappen för CorrelationInitializers. Välj länken Lägg till initierare, ange
orderIdHandle
i textrutan Initierare, välj Frågekorrelationsinitierare för korrelationstypen och välj p_orderId under listrutan XPATH-frågor. Inställningarna visas i följande bild. Klicka på OK. Detta initierar en korrelation mellan klienten och den här instansen av arbetsflödestjänsten. När ett meddelande som innehåller det här order-ID:t tas emot dirigeras det till den här instansen av arbetsflödestjänsten.
Dra och släpp en annan ReceiveAndSendReply-aktivitet till slutet av arbetsflödet (utanför sekvensensom innehåller de första mottagnings- och SendReply-aktiviteterna). Detta tar emot det andra meddelandet som skickas av klienten och svarar på det.
Välj den sekvens som innehåller de nyligen tillagda aktiviteterna Ta emot och SkickaReply och klicka på knappen Variabler . Lägg till variabeln markerad i följande bild:
Lägg även till
orderResult
som Sträng i omfångetSequence
.Välj aktiviteten Ta emot och ange de egenskaper som visas i följande bild:
Kommentar
Glöm inte att ändra fältet ServiceContractName med
../IAddItem
.Klicka på länken Definiera... i aktiviteten ReceiveAddItem och lägg till parametrarna som visas i följande bild:Detta konfigurerar mottagningsaktiviteten för att acceptera två parametrar, order-ID och ID för objektet som sorteras.
Klicka på knappen CorrelateOn-ellips och ange
orderIdHandle
. Under XPath-frågor klickar du på listrutepilen och väljerp_orderId
. Detta konfigurerar korrelationen för den andra mottagningsaktiviteten. Mer information om korrelation finns i Korrelation.Dra och släpp en If-aktivitet omedelbart efter aktiviteten ReceiveAddItem . Den här aktiviteten fungerar precis som en if-instruktion.
Ange egenskapen Villkor till
itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)
Dra och släpp en Tilldela aktivitet i avsnittet Sedan och en annan i avsnittet Else anger egenskaperna för Tilldela aktiviteter enligt följande bild.
Om villkoret är
true
kommer avsnittet Then att köras. Om villkoret ärfalse
avsnittet Else körs.Välj aktiviteten SendReplyToReceive och ange egenskapen DisplayName som visas i följande bild.
Klicka på länken Definiera ... i aktiviteten SetReplyToAddItem och konfigurera den enligt följande bild. Detta konfigurerar aktiviteten SendReplyToAddItem för att returnera värdet i variabeln
orderResult
.
Öppna filen web.config och lägg till följande element i beteendeavsnittet <> för att aktivera arbetsflödets beständighet.
<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"/>
Varning
Ersätt värd- och SQL Server-instansnamnet i föregående kodfragment.
Skapa lösningen.
Skapa ett klientprogram för att anropa arbetsflödestjänsten
Lägg till ett nytt konsolprogramprojekt som heter
OrderClient
i lösningen.Lägga till referenser till följande sammansättningar i
OrderClient
projektetSystem.ServiceModel.dll
System.ServiceModel.Activities.dll
Lägg till en tjänstreferens till arbetsflödestjänsten och ange
OrderService
som namnrymd.Main()
I -metoden för klientprojektet lägger du till följande kod: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); }
Skapa lösningen och kör programmet
OrderClient
. Klienten visar följande text:Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...
Om du vill kontrollera att arbetsflödestjänsten har sparats startar du SQL Server Management Studio genom att gå till Start-menyn, Välj alla program, Microsoft SQL Server 2008, SQL Server Management Studio.
- I det vänstra fönstret expanderar du Databaser, SQLPersistenceStore, Vyer och högerklickar på System.Activities.DurableInstancing.Instances och väljer Välj de 1 000 översta raderna. I fönstret Resultat kontrollerar du att minst en instans visas. Det kan finnas andra instanser från tidigare körningar om ett undantag inträffade vid körning. Du kan ta bort befintliga rader genom att högerklicka på System.Activities.DurableInstancing.Instances och välja Redigera de 200 översta raderna, trycka på knappen Kör , markera alla rader i resultatfönstret och välja ta bort. Kontrollera att instansen som visas i databasen är den instans som ditt program skapade genom att kontrollera att instansvyn är tom innan klienten körs. När klienten körs kör du frågan igen (Välj de 1 000 översta raderna) och kontrollerar att en ny instans har lagts till.
Tryck på Retur för att skicka meddelandet lägg till objekt till arbetsflödestjänsten. Klienten visar följande text:
Sending add item messageService returned: Item added to orderPress any key to continue . . .