Services en transacties
WcF-toepassingen (Windows Communication Foundation) kunnen een transactie starten vanuit een client en de transactie coördineren binnen de servicebewerking. Clients kunnen een transactie initiëren en verschillende servicebewerkingen aanroepen en ervoor zorgen dat de servicebewerkingen worden doorgevoerd of teruggedraaid als één eenheid.
U kunt het transactiegedrag in het servicecontract inschakelen door een ServiceBehaviorAttribute en instelling op te geven en de eigenschappen ervan in TransactionScopeRequired te stellen TransactionIsolationLevel voor servicebewerkingen waarvoor clienttransacties zijn vereist. De TransactionAutoComplete parameter geeft aan of de transactie waarin de methode wordt uitgevoerd automatisch wordt voltooid als er geen onverwerkte uitzonderingen worden gegenereerd. Zie ServiceModel Transaction Attributes voor meer informatie over deze kenmerken.
Het werk dat wordt uitgevoerd in de servicebewerkingen en wordt beheerd door een resourcemanager, zoals het bijwerken van logboekregistratiedatabases, maakt deel uit van de transactie van de client.
In het volgende voorbeeld ziet u het gebruik van de en OperationBehaviorAttribute kenmerken voor het beheren van transactiegedrag ServiceBehaviorAttribute aan de servicezijde.
[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CalculatorService: ICalculatorLog
{
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Add(double n1, double n2)
{
recordToLog($"Added {n1} to {n2}");
return n1 + n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Subtract(double n1, double n2)
{
recordToLog($"Subtracted {n1} from {n2}");
return n1 - n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Multiply(double n1, double n2)
{
recordToLog($"Multiplied {n1} by {n2}");
return n1 * n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Divide(double n1, double n2)
{
recordToLog($"Divided {n1} by {n2}", n1, n2);
return n1 / n2;
}
}
U kunt transacties en transactiestroom inschakelen door de client- en servicebindingen te configureren om het WS-AtomicTransaction-protocol te gebruiken en het <transactionFlow-element> in te true
stellen op, zoals wordt weergegeven in de volgende voorbeeldconfiguratie.
<client>
<endpoint address="net.tcp://localhost/ServiceModelSamples/service"
binding="netTcpBinding"
bindingConfiguration="netTcpBindingWSAT"
contract="Microsoft.ServiceModel.Samples.ICalculatorLog" />
</client>
<bindings>
<netTcpBinding>
<binding name="netTcpBindingWSAT"
transactionFlow="true"
transactionProtocol="WSAtomicTransactionOctober2004" />
</netTcpBinding>
</bindings>
Clients kunnen een transactie starten door een TransactionScope servicebewerking te maken en aan te roepen binnen het bereik van de transactie.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//Do work here
ts.Complete();
}