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.