Programmering

Sådan arbejder du med transaktionsbaserede WCF-tjenester

WCF (Windows Communication Foundation) er en sikker, pålidelig og skalerbar messingsplatform til udvikling af tjenester i .Net.

En transaktion er et sæt udsagn, der udføres ved at følge ACID-principperne (ACID står for atomiske, konsistente, isolerede og holdbare operationer). Når en af ​​operationerne i transaktionsblokken mislykkes, afbrydes hele transaktionen, dvs. hele transaktionen mislykkes. WCF yder support til distribuerede transaktionsoperationer. Du kan udnytte TransactionScope-klassen til stede i System.Transactions navneområdet til effektiv transaktionsstyring, når du arbejder i .Net.

Implementering af WCF-transaktioner

I dette afsnit vil vi undersøge, hvordan vi kan oprette transaktionsbaserede WCF-tjenester. For at komme i gang skal du oprette to WCF-tjenester. Du kan også oprette et andet projekt (en konsol eller et webprojekt) for at teste dine tjenester. Når de to WCF-tjenester er oprettet, skal du dekorere de operationskontrakter, der ville være en del af transaktionen, med attributten TransactionFlow. Dette er nødvendigt for at muliggøre transaktionssupport.

Denne attribut accepterer TransactionFlowOption enum som en parameter. TransactionFlowOption kan have en af ​​følgende værdier:

  • TransactionFlowOption.Tilladt
  • TransactionFlowOption. Obligatorisk
  • TransactionFlowOption.NotAllowed

Når du arbejder med WCF, skal du først oprette en servicekontrakt og derefter definere serviceoperationer eller operationskontrakter i den. Du har mange forskellige typer kontrakter i WCF - servicekontrakter, datakontrakter, fejlkontrakter, meddelelseskontrakter og driftskontrakter. I dette eksempel bruger vi servicekontrakter og driftskontrakter, da de andre kan være valgfri. En servicekontrakt bruges til at specificere de operationer, der er tilgængelige for serviceklienten at forbruge. I dette afsnit opretter vi to servicekontrakter for de to WCF-tjenester, vi bruger.

Følgende kodestykke illustrerer, hvordan du kan konfigurere TransactionFlow-attributten i din WCF-servicekontrakt til at yde transaktionsstøtte. Bemærk, at du også skal gøre det i de andre driftskontrakter (der er en del af transaktionen).

[Service kontrakt]

offentlig grænseflade IOrderService

{

[OperationContract]

[TransactionFlow (TransactionFlowOption.Allowed)]

ugyldig AddOrder (ordreordre);

}

Bemærk, at hver servicekontrakt skal have en eller flere driftskontrakter til at definere de operationer, der er eksponeret over ledningen. En driftskontrakt bruges til at definere signaturen for servicemetoden og også transaktionsflowet, retningen af ​​servicedriften og eventuelt eventuelle fejlkontrakter, der kan være tilknyttet.

Sådan ser IOrderHeaderService-grænsefladen (servicekontrakt) ud.

[Service kontrakt]

offentlig grænseflade IOrderHeaderService

{

[OperationContract]

[TransactionFlow (TransactionFlowOption.Allowed)]

ugyldig AddOrderHeader (OrderHeader orderHeader);

}

Dernæst skal du sikre dig, at din servicemetode er dekoreret med TransactionScopeRequired ved hjælp af attributten OperationBehavior. I det væsentlige skal du indstille egenskaben TransactionScopeRequired til "true" i driftskontrakten som vist i kodestykket nedenfor. Erklæringen TransactionScopeRequired = true bruges til at specificere, at servicefunktionen skal udføre et transaktionsomfang.

[OperationBehavior (TransactionScopeRequired = true)]

offentlig ugyldig AddOrder (ordreordre)

{

// Skriv kode her for at tilføje en ordreoptegnelse til databasen

}

Den samme ændring gælder også for den anden servicefunktion.

[OperationBehavior (TransactionScopeRequired = true)]

offentlig ugyldig AddOrderHeader (OrderHeader orderHeader)

{

// Skriv kode her for at tilføje en ordrehovedpost til databasen

}

Det næste trin er at konfigurere din servicekonfigurationsfil til at aktivere transaktionsflow. Forudsat at du bruger wsHttpBinding, her er hvordan du kan konfigurere din WCF-tjeneste til at levere transaktionsflowstøtte.

Bemærk, at når du arbejder med transaktionsbaserede WCF-tjenester, kan du valgfrit angive pålidelig besked for at fortynde muligheden for afbrudte transaktioner på grund af kommunikationsfejl. Du skal også konfigurere dine WCF-serviceendepunkter i overensstemmelse hermed for at udnytte den binding, vi lige har defineret.

bindingConfiguration = "Transaktionel" kontrakt = "Services.IOrderService">

Du bliver nu nødt til at drage fordel af klassen TransactionScope, der findes i System.Transactions navneområde for at ringe til dine tjenester inden for et transaktionsomfang. Du kan typisk bruge denne klasse til at implementere transaktionsomfang til håndtering af indbyrdes afhængige transaktioner og løse samtidige konflikter, når du arbejder med ADO.Net.

prøve

{

bruger (TransactionScope transactionScope = ny TransactionScope (TransactionScopeOption.RequiresNew))

  {

// Skriv kode her for at ringe til servicemetoderne for dine tjenester her

transactionScope.Complete ();

  }

}

fangst

{

// Skriv kode her for at håndtere undtagelser

}

Og det er alt hvad du behøver at gøre. Du kan nu udføre din ansøgning og teste dine transaktionelle tjenester.