Programmering

Hvordan jobbe med transaksjonelle WCF-tjenester

WCF (Windows Communication Foundation) er en sikker, pålitelig og skalerbar meldingsplattform for utvikling av tjenester i .Net.

En transaksjon er et sett av utsagn som utføres ved å følge ACID-prinsippene (ACID står for Atomic, Consistent, Isolated og Durable operations). Når en av operasjonene i transaksjonsblokken mislykkes, avbrytes hele transaksjonen, dvs. hele transaksjonen mislykkes. WCF gir støtte for distribuerte transaksjonsoperasjoner. Du kan utnytte TransactionScope-klassen som er tilstede i System.Transactions-navneområdet for effektiv transaksjonsadministrasjon når du arbeider i .Net.

Implementering av WCF-transaksjoner

I denne delen vil vi undersøke hvordan vi kan lage transaksjonelle WCF-tjenester. For å komme i gang, opprett to WCF-tjenester. Du kan også opprette et annet prosjekt (en konsoll eller et webprosjekt) for å teste tjenestene dine. Når de to WCF-tjenestene er opprettet, bør du dekorere operasjonskontraktene som vil være en del av transaksjonen med attributtet TransactionFlow. Dette er nødvendig for å muliggjøre transaksjonsstøtte.

Dette attributtet godtar TransactionFlowOption-enum som en parameter. TransactionFlowOption kan ha en av følgende verdier:

  • TransactionFlowOption.Tillatt
  • TransactionFlowOption. Obligatorisk
  • TransactionFlowOption.NotAllowed

Når du jobber med WCF, må du først opprette en tjenestekontrakt og deretter definere tjenestedriften eller operasjonskontraktene i den. Du har mange forskjellige typer kontrakter i WCF - servicekontrakter, datakontrakter, feilkontrakter, meldekontrakter og operasjonskontrakter. I dette eksemplet vil vi bruke tjenestekontrakter og driftskontrakter da de andre kan være valgfrie. En ServiceContract brukes til å spesifisere operasjonene som er tilgjengelige for tjenesteklienten å konsumere. I denne delen oppretter vi to servicekontrakter for de to WCF-tjenestene vi bruker.

Følgende kodebit illustrerer hvordan du kan konfigurere TransactionFlow-attributtet i WCF-tjenestekontrakten for å gi transaksjonsstøtte. Merk at du må gjøre det samme i de andre operasjonskontraktene (som er en del av transaksjonen) også.

[Servicekontrakt]

offentlig grensesnitt IOrderService

{

[OperationContract]

[TransactionFlow (TransactionFlowOption.Allowed)]

ugyldig AddOrder (bestillingsordre);

}

Merk at hver servicekontrakt skal ha en eller flere driftskontrakter for å definere operasjonene som er eksponert over ledningen. En operasjonskontrakt brukes til å definere signaturen til servicemetoden og også transaksjonsflyten, retningen på servicedriften og eventuelt eventuelle feilkontrakter som kan være tilknyttet.

Slik ser IOrderHeaderService-grensesnittet (servicekontrakt) ut.

[Servicekontrakt]

offentlig grensesnitt IOrderHeaderService

{

[OperationContract]

[TransactionFlow (TransactionFlowOption.Allowed)]

ugyldig AddOrderHeader (OrderHeader orderHeader);

}

Deretter bør du sørge for at tjenestemetoden din er dekorert med TransactionScopeRequired ved hjelp av attributtet OperationBehavior. I hovedsak bør du sette egenskapen TransactionScopeRequired til "true" i operasjonskontrakten som vist i kodebiten nedenfor. Uttalelsen TransactionScopeRequired = true brukes til å spesifisere at tjenestedriften trenger et transaksjonsomfang som skal utføres.

[OperationBehavior (TransactionScopeRequired = true)]

offentlig ugyldig AddOrder (bestillingsordre)

{

// Skriv kode her for å legge til en ordreoppføring i databasen

}

Den samme endringen gjelder også for den andre tjenestedriften.

[OperationBehavior (TransactionScopeRequired = true)]

offentlig ugyldig AddOrderHeader (OrderHeader orderHeader)

{

// Skriv kode her for å legge til en ordrehodeoppføring i databasen

}

Neste trinn er å konfigurere tjenestekonfigurasjonsfilen for å aktivere transaksjonsflyt. Forutsatt at du bruker wsHttpBinding, kan du konfigurere WCF-tjenesten din slik at den gir støtte for transaksjonsflyt.

Vær oppmerksom på at når du arbeider med transaksjonelle WCF-tjenester, kan du eventuelt spesifisere pålitelige meldinger for å fortynne muligheten for avbrutte transaksjoner på grunn av kommunikasjonsfeil. Du bør også konfigurere WCF-tjenestens endepunkter tilsvarende for å utnytte bindingen vi nettopp har definert.

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

Du må nå dra nytte av TransactionScope-klassen som er tilstede i System.Transactions navneområdet for å ringe tjenestene dine innen ett transaksjonsomfang. Vanligvis kan du bruke denne klassen til å implementere transaksjonsomfang for å håndtere gjensidig avhengige transaksjoner og løse samtidighetskonflikter når du jobber med ADO.Net.

prøve

{

bruker (TransactionScope transactionScope = new TransactionScope (TransactionScopeOption.RequiresNew))

  {

// Skriv kode her for å ringe tjenestemetodene til tjenestene dine her

transactionScope.Complete ();

  }

}

å fange

{

// Skriv kode her for å håndtere unntak

}

Og det er alt du trenger å gjøre. Du kan nå utføre søknaden din og teste transaksjonstjenestene dine.

$config[zx-auto] not found$config[zx-overlay] not found